【问题标题】:replace infinite loop in tcp listner socket c#在 tcp listener socket c# 中替换无限循环
【发布时间】:2013-04-02 10:30:26
【问题描述】:

我正在使用套接字侦听器从客户端接收数据。

服务器监听连接时是否可以替换无限循环while (true)

// 监听传入的连接。 尝试 { listener.Bind(localEndPoint); listener.Listen(10); // Start listening for connections. while (true)//infinite loop { }

【问题讨论】:

  • 有没有可能..你试过了吗?
  • 为什么要更换死循环?
  • 不,不是。您可以在每次连接关闭时启动不同的线程,但这很容易出错。你不喜欢循环的什么地方?
  • 我在 winform 应用程序中使用列表器。当循环运行时,表单停止工作
  • 这是因为你在主线程上运行循环。尝试使用工作进程或此循环的新线程。您也可以尝试使用 Socket 类中可用的异步方法调用。

标签: c# .net sockets


【解决方案1】:

假设您的 while 循环如下所示:

while(true)
{
    Socket workerSocket = listener.Accept();
    DoSomethingWithSocket(workerSocket);
}

然后是的,用

替换 while(true)

listener.BeginAccept(new AsyncCallback(OnClientConnect), null);

然后添加一个方法

 public void OnClientConnect(IAsyncResult asyn)
 {

    Socket workerSocket = Listener.EndAccept(asyn);
    Listener.BeginAccept(new AsyncCallback(OnClientConnect), null);
    DoSomethingWithSocket(workerSocket);
 }

【讨论】:

  • 为了清楚起见,只有一个问题。如果已经有一个无限循环,为什么还要在回调中添加第二个 beginaccept?
  • 编辑:您的意思是删除while循环吗?如果是,当我尝试它时,我的控制台应用程序甚至在回调被一个连接击中之前就退出了。你能建议吗?
  • @PradeepPuranik 是的,替换整个循环。如果您在控制台中运行,则需要一段时间(运行)退出机制来防止 main 方法到达末尾并清理所有内容。
  • 感谢您的确认。这意味着我无法摆脱循环。我试图摆脱循环的原因是因为我的服务器需要同时侦听 2 个不同的端口(对于普通/管理命令),所以当我为第一个侦听器启动循环时,我不知道我是如何可以同时启动第二个。任何建议将不胜感激。
  • 更新:好的,我尝试在实例化一个对象后在主函数中添加无限循环以启动两个侦听器。该循环与任何一个侦听器都无关,所以它现在似乎可以工作。尽管我不确定这是否是您的意思,或者这是否是公认的方法,或者至少对于生产代码来说足够有效。请原谅我的困惑,因为我刚刚开始使用套接字编程。
猜你喜欢
  • 2016-12-21
  • 2012-09-03
  • 2015-06-08
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
相关资源
最近更新 更多