如果套接字仍然连接,EndReceive应该返回零吗?

时间:2014-11-04 17:01:25

标签: c# sockets asynchronous

我正在socket上进行以下BeginReceive调用:

m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, this.ReceiveCallback, null);

在我的课程ReceiveCallback中,我打电话给

try {
    int bytesReadFromSocket = m_socket.EndReceive(ar);
    if(bytesReadFromSocket > 0) {
         // Do some processing
    }
}
finally {
   if(m_socket.Connected) m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, this.ReceiveCallback, null);
}

我遇到的问题是EndReceive返回零,但是m_socket.Connected返回true,所以我再次调用BeginReceive。这发生在一个永不停止的紧密循环中。当EndReceive返回零时,从文档中不清楚。我认为它只发生在套接字关闭时,但这似乎不是真的。

所以问题仍然存在,在什么条件下EndReceive会返回零?

2 个答案:

答案 0 :(得分:5)

Socket.EndReceive()在一个特定情况下返回0:远程主机已经开始或确认了正常的闭包序列(例如,对于基于.NET Socket的程序,使用{Socket.Shutdown()调用SocketShutdown.Send {1}}或SocketShutdown.Both)。

但请注意,从技术上讲,在套接字最终关闭之前,它已连接"。

您不应使用Connected属性来确定是否从套接字发出另一个读取。相反,由于返回值0专门用于指示不再发送数据,因此您应该只检查EndReceive()的返回值,如果值为正数,则再次调用BeginReceive()(即不是零。)

答案 1 :(得分:-1)

有时我们正在测试TCP连接,却忘记了初始化缓冲区数组。当它为null或为空时,EndReceive()将始终返回0。我对此有愚蠢的经验。