【问题标题】:networking design ; socket communication using polling网络设计;使用轮询的套接字通信
【发布时间】:2010-10-10 20:39:21
【问题描述】:

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

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

关于客户

客户端是一个 UI,它产生一个单独的线程来提交和处理请求。一旦它提交了所有请求,它就会调用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 组件创建的。

问题:

即使主应用程序已按时发送数据,客户端有时也会看到回调延迟。值得注意的是,轮询中的一条消息被延迟,直到我的客户端断开连接,我在内部调用了:

_socket.Shutdown(SocketShutdown.Both);

我认为 投票

中发生了一些奇怪的事情

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

谢谢

如果有什么不清楚的地方请告诉我

【问题讨论】:

  • @Adam Devis - 感谢您更正标题中的拼写。

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


【解决方案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.类型错误。 2. IsConnected 是我的包装器,而 IsAvailable 只是 Availalble。谢谢
【解决方案2】:

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

除此之外,如果不查看更多代码,很难为您提供太多帮助。

【讨论】:

  • 好吧,我正在创建一个单独的线程来执行处理,实际上,负责调用等待。我将说明如何创建上面的线程。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多