我有多線程應用程序,它定期輪詢幾百個設備。 每個線程服務於一個設備,其套接字和其他描述符封裝在單個對象上,因此沒有共享描述符。 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根據定義是一個永遠不會被有效套接字使用的值。 –