0

我使用了这个线程中的 SocketClient.cs和 msdn 中的非常相似。

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

我在 Windows 8 上有主机应用程序,然后我从带有某种信息的电话数据包发送。然后主机用新数据包回复我。方法“接收”接收空信息。缓冲区为空。如何解决?

4

1 回答 1

0

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

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

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

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

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

所以基本思想是:如果你使用 SocketAsyncEventArgs,不要使用线程。异步套接字方法尝试使线程对用户透明,您只需在此之上添加一个线程层。这很可能会给你带来麻烦。

于 2013-08-19T11:24:05.930 回答