tcp accept返回的新端口被莫名其妙的关闭了 10038的错误码
tcp 接收的主线程如下:
while(bQuit==false){
struct sockaddr_in peer_addr;
socklen_t addrlen = sizeof(peer_addr);
SOCKET client = accept(skTcp, (SOCKADDR*)&peer_addr, &addrlen);
TRACE("accept client: %d, from ip: %s\n", client, inet_ntoa(peer_addr.sin_addr));
if (client != INVALID_SOCKET) {
//recvTcpSvrMsg(client);
isSockValid(client);
std::string mess = ReadStrVar(client);
isSockValid(client);
TRACE("recvTcpSvrMsg: %s\n", mess.c_str());
std::string ret = handlTcpMessage(mess);
isSockValid(client);
SendStrVar(client, ret);
closesocket(client);
}
简单来讲就是收到新的连接,则用新的sock进行接收信息,返回结果,然后结束连接。但是就会偶尔发现client这个sock被关掉了,出现10038的错误。但是我遍寻代码都没有找到关掉这个sock的地方。后来实在没办法,做一个closesocket的桩函数,替换原来的系统函数,并且在桩函数中输出调试信息,和代码的位置。最终才发现,在别的网络模块代码中,存在这样的代码:
void CStreamSock::DeInit()
{
if(INVALID_SOCKET == m_sock_udp)
return;
shutdown(m_sock_udp, SD_BOTH); closesocket(m_sock_udp);
//TRACE("CStreamSock::DeInit\n");
}
而它的析构函数也出现类似关闭sock的代码。
哦! 那很有可能是socket句柄重用所造成的, 例如:
1.CStreamSock::DeInit()关闭了1234的socket句柄,但是并没有把这个变量置为INVALID_SOCKET;
2.tcp 接收的主线程的accpet返回了值为1234的socket句柄给用--因为系统认为这个值已经没有人用了;
3.CStreamSock的析构函数又调用closesocket关闭了值为1234的sock,结果导致的tcp接收线程后续的10038的问题!!

浙公网安备 33010602011771号