如果套接字仍处于连接状态,EndReceive是否应该返回零?

bpe*_*kes 5 c# sockets asynchronous

我在套接字上进行以下BeginReceive调用:

m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, this.ReceiveCallback, null);
Run Code Online (Sandbox Code Playgroud)

在我的班级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);
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是EndReceive返回零,但是m_socket.Connected返回true,所以我再次调用BeginReceive。这发生在一个永不停止的紧密循环中。从文档中还不清楚EndReceive是否返回零。我以为只有在关闭套接字时才会发生这种情况,但事实并非如此。

因此问题仍然存在,EndReceive在什么条件下可以返回零?

Pet*_*iho 6

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

但是请注意,从技术上讲,直到最终关闭插座,插座才被“连接”。

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