UDP空缓冲区ReceiveAsync

时间:2013-03-15 12:04:13

标签: udp buffer socketasynceventargs

我使用了来自thread的SocketClient.cs,与msdn。

非常相似

有人可以告诉我为什么收到数据包后缓冲区是空的?

我在Windows 8上有主机应用程序,然后我从Phone数据包发送了一些信息。然后主持人用新包回复我。方法'Receive'接收空信息。缓冲区为空。如何解决?

1 个答案:

答案 0 :(得分:0)

如果您没有对SAEA对象的已完成事件做出反应,则表示尚未收到任何数据。如果你是,那么你收到一条空信息,或者你的缓冲区大小为0.这就是文档告诉你的。

我查看了链接中的代码,发现它正在使用带有SendToAsync方法的ManualResetEvent。我不知道为什么会这样做,但它可能是一个原因,具体取决于指定的超时。

我想不是每个人都在阅读SAEA对象的文档,但您必须将其视为线程同步对象。它被发送到一个线程,它在那里工作并且信号完成,就是它。也许这是链接帖子中代码的问题,应该从SAEA对象接收信号的线程忙,直到调用Reset方法。如果是这样,那么在另一个线程中工作的SAEA对象中没有任何事件正在通过。

另请注意,如果调用时结果可用,SendToAsync可能会立即返回false。您可以立即检查结果。所以你可以安全地称之为

if (!_socket.SendToAsync(myEventArgs))
  ProcessResult(myEventArgs);

所以基本思路是:如果使用SocketAsyncEventArgs,请不要使用线程。 Async套接字方法尝试使线程对用户透明,您只需在此基础上添加线程层。这可能会让你陷入困境。