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的问题!!

posted @ 2026-08-16 11:50  slowtech-QQ914100608  阅读(1)  评论(0)    收藏  举报