UDP空缓冲区ReceiveAsync

问题描述:

我从这个thread使用SocketClient.cs和msdn非常相似。UDP空缓冲区ReceiveAsync

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

我有Windows 8上的主机应用程序,然后我从手机数据包发送某种信息。然后主机用新数据包回复我。方法'接收'收到空的信息。缓冲区是空的。如何解决这个问题?

如果您没有对SAEA对象的Completed事件作出反应,则没有收到任何数据。如果你是,那么你收到一条空的消息或者你的缓冲区大小是0.这是文档告诉你的。

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

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

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

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

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