我创建了一个Win32服务器 - 客户端应用程序,其中许多客户端连接到单个服务器,发送查询和 recv
响应 .
它在许多安装中都能正常工作,但在其他一些安装中关闭了连接 . 客户端和服务器都报告远程主机已关闭连接 . 创建连接后的套接字操作顺序如下:
Client: sends query Q1 (by calling send)
Server: recvs query Q1 and sends R1
Client: recvs R1
Client: sends query Q2
Server: recvs query Q2 and sends R2
Client: recvs R2
and so on
在某些网络中,经过一段时间,例如1小时或10分钟,
Client: Sends Q(n) successfully
Server: recvs SOCKET_ERROR and my code exits thread.
//unexpected
WSAGetLastError() at server returns 10054: An existing connection was forcibly closed by the remote host.
Client: recvs SOCKET_ERROR.
WSAGetLastError() at client also returns 10054
在服务器中,每个客户端都有一个线程 . 服务器在响应之前具有可忽略的延迟 .
为什么服务器端的函数 recv()
返回SOCKET_ERROR?谁关闭了插座?编辑:我更新了问题并将WSAGetLastErrorCode()返回值 . 为什么-1?这个问题出了什么问题?
1 回答
正如文档中所述
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
10054错误
您可能在收到此错误时退出程序,因此检查该错误并执行逻辑以从客户端列表或您可能拥有的其他结构中删除客户端并完成其线程,但您不需要关闭套接字 .
这是recv()返回值文档