gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:03:44 26 4
gpt4 key购买 nike

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

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

在我的类(class)中调用 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 返回真,所以我再次调用 BeginReceive。这发生在一个永远不会停止的紧密循环中。当 EndReceive 返回零时,文档中并不清楚。我假设它只在套接字关闭时发生,但这似乎不是真的。

那么问题来了,EndReceive在什么情况下可以返回0?

最佳答案

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

但是请注意,从技术上讲,直到套接字最终关闭,它才处于“连接”状态。

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

关于c# - 如果套接字仍处于连接状态,EndReceive 是否应该返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26740823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com