EndReceive何时返回零字节

时间:2010-10-19 17:09:11

标签: .net sockets

我正在尝试更好地处理异步使用套接字。根据这篇文章http://msdn.microsoft.com/en-us/library/bew39x2a(v=VS.85).aspx,我应该能够检查EndReceive返回的字节数,如果它是零,我知道我拥有所有数据,如果它不为零,那么可能会或者可能没有更多的数据来了。这是有道理的,但是当我最后一次调用BeginReceive时,通常在调用回调函数前几分钟......我假设某些东西必须超时,但更改Socket.ReceiveTimeout属性似乎没有效果

这是否真的是用于确定我何时收到所有数据的正确模式?特别是当我不知道我收到的消息的格式时?

2 个答案:

答案 0 :(得分:3)

这取决于“所有数据”的含义。另一端关闭了插座吗?如果没有,您还没有真正读取所有数据,因为服务器可以随时发送更多数据。

如果另一端已经关闭了套接字,那么回调应该会很快发生。

答案 1 :(得分:0)

由于TCP是面向流的协议,因此有3种通用方法可以知道消息何时被完全接收:

  1. 消息长度是已知的(因为它是固定的长度,或者因为协议中的某些内容告诉你它有多长)
  2. 邮件末尾有一个分隔符,您可以检查
  3. 连接已关闭