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

问题描述 投票:5回答:2

我正在套接字上进行以下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在什么条件下可以返回零?

c# sockets asynchronous
2个回答
6
投票

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

但是请注意,从技术上讲,直到最后关闭套接字,它都是“连接的”。

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.