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在什么条件下可以返回零?
Socket.EndReceive()
在一种特定情况下,返回0:远程主机已开始或确认正常关闭序列(例如,对于基于.NET Socket
的程序,Socket.Shutdown()
使用SocketShutdown.Send
或调用SocketShutdown.Both
)。
但是请注意,从技术上讲,直到最终关闭插座,插座才被“连接”。
您不应使用该Connected
属性来确定是否从套接字发出另一个读取。取而代之的是,由于专门保留了返回值0来指示将不再发送任何数据,因此您只需检查返回值,如果该值为正数(即不为零),则再次EndReceive()
调用BeginReceive()
。
归档时间: |
|
查看次数: |
3105 次 |
最近记录: |