我有多线程应用程序,它定期轮询几百个设备。 每个线程服务于一个设备,其套接字和其他描述符封装在单个对象上,因此没有共享描述符。 closesocket(fSock)偶尔应用程序崩溃,当我尝试设置描述符fSock为0.服务器在closesocket后崩溃
我假设,如果closesocket(fSock)返回SOCKET_ERROR,我不应该设置fSock = 0。 还是有其他原因吗?
我的代码:
bool _EthDev::Connect()
{
int sockErr, ret, i, j;
int szOut = sizeof(sockaddr_in);
// create socket
if ((fSock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
sockErr = GetLastError();
Log("Invalid socket err %d", sockErr);
fSock = 0;
return false;
}
// set fast closing socket (by RST)
linger sLinger;
sLinger.l_onoff = 1;
sLinger.l_linger = 0;
if (sockErr = setsockopt(fSock, SOL_SOCKET, SO_LINGER, (const char FAR*)&sLinger, sizeof(linger)))
{
sockErr = WSAGetLastError();
Log("Setsockopt err %d", sockErr);
closesocket(fSock);
fSock = 0; // here crashes
return false;
}
// connect to device
fSockaddr.sin_port = htons((u_short)(baseport));
if (connect(fSock, (struct sockaddr*)&fSockaddr, szOut))
{
closesocket(fSock);
fSock = 0;
return false;
}
...
return true;
}
零不是一个套接字无效的值。如果你想表明fSock不再是一个有效的套接字,你应该将它设置为INVALID_SOCKET而不是0,因为INVALID_SOCKET根据定义是一个永远不会被有效套接字使用的值。 –