我从这个线程使用SocketClient.cs,从msdn非常相似。
有人能告诉我为什么收到数据包后缓冲区是空的吗?
我在windows 8上有主机应用程序,然后我从手机上发送一些信息。然后主机用新的数据包回复我。方法'Receive'接收空信息。缓冲区为空。如何解决这个问题?
如果您没有对SAEA对象的Completed事件作出反应,则没有接收到任何数据。如果是,那么您收到了一条空消息,或者您的缓冲区大小为0。这是医生告诉你的。
我看了看你的链接中的代码,发现它正在使用一个ManualResetEvent与SendToAsync方法。我不知道它为什么这样做,但它可能是一个原因,取决于指定的超时。
我猜不是每个人都在阅读SAEA对象的文档,但是你必须把它看作一个线程同步对象。它被发送到一个线程,在那里完成它的工作并发出结束的信号,仅此而已。也许这是您链接的帖子中代码的问题,应该从SAEA对象接收信号的线程正在忙,直到调用Reset方法。如果是,则在另一个线程中工作的SAEA对象的任何事件都无法通过。
还请注意,如果在调用时结果可用,SendToAsync可能会立即返回false。你可以马上检查结果。所以你可以把它命名为
if (!_socket.SendToAsync(myEventArgs))
ProcessResult(myEventArgs);
所以基本的想法是:如果你使用SocketAsyncEventArgs,不要使用线程。Async套接字方法试图使线程对用户透明,您只需在此基础上添加一个线程层。这可能会给你带来麻烦。