网络设计;使用轮询的套接字通信

时间:2009-03-02 19:39:32

标签: c# .net design-patterns networking sockets

关于正在进行的设计和实施的几句话

我向远程应用程序发送了大量请求(在不同的应用程序上运行) 主机,当然),应用程序发回数据。

关于客户

客户端是一个UI,它生成一个单独的线程来提交和处理请求。一旦提交了所有请求,它就会调用Wait。 Wait将解析来自应用程序的所有事件并调用客户端的回调。

以下是Wait的实现。

public void Wait (uint milliseconds)
{
       while(_socket.IsConnected)
       {
         if (_socket.Poll(milliseconds, SelectMode.SelectRead))
         {
              // read info of the buffer and calls registered callbacks for the client
              if(_socket.IsAvailable > 0)
                    ProcessSocket(socket);
         }
         else
            return; //returns after Poll has expired
      }
}

从单独的线程调用 Wait ,负责管理网络连接:入站和出站流量:

         _Receiver = new Thread(DoWork);
         _Receiver.IsBackground = true;
         _Receiver.Start(this);

此线程是从应用程序的UI组件创建的。

问题:

即使主应用程序已按时发送数据,

客户端有时也会看到回调延迟。值得注意的是,Poll中的一条消息被延迟,直到我的客户端断开连接,并在内部我打电话:

_socket.Shutdown(SocketShutdown.Both);

我认为在民意调查

中会发生一些时髦的事情

有关如何解决问题或替代解决方法的任何建议?

由于

如果有任何不清楚的地方,请告诉我

2 个答案:

答案 0 :(得分:1)

有几件事。首先,在您的示例中,“_socket”和“socket”之间是否存在差异?其次,您正在使用System.Net.Sockets.Socket类,对吧?对于任何返回1.1的.NET版本,我都没有在MSDN文档中看到该类上的IsConnected或IsAvailable属性。我认为这些都是打字错误,对吧?

您是否尝试在“IsAvailable> 0”测试中添加“else”子句并将消息写入控制台/输出窗口,例如,

  if (_socket.IsAvailable > 0) {
      ProcessSocket(socket);
  } else {
      Console.WriteLine("Poll() returned true but there is no data");
  }

这可能会让您了解在您的计划的更大范围内可能会发生什么。

除此之外,我不是数据轮询套接字的忠实粉丝。作为替代方案,是否有理由不在套接字上使用异步Begin / EndReceive函数?我认为,鉴于您已经使用单独的线程来发送和接收数据这一事实,转换为异步模型会很简单。这是来自MSDN的example。另外,我已将我使用此机制的典型实现添加到this SO post

答案 1 :(得分:0)

调用Wait()方法的线程是什么?如果你只是把它扔进UI线程池,这可能就是你有时会遇到延迟的原因。如果这是您的问题,那么使用系统线程池,为应用程序的网络部分创建一个新的线程池,或为其生成专用线程。

除此之外,如果没有看到更多代码,很难帮助你。