У меня многопоточное приложение, оно периодически опросает несколько сотен устройств. Каждый поток обслуживает одно устройство, его сокет и другие дескрипторы инкапсулируются на отдельный объект, поэтому нет общих дескрипторов. Иногда аварийные ситуации приложения после closesocket (fSock), когда я пытаюсь установить дескриптор fSock на 0.Сбой сервера после closesocket
Я предполагаю, что я не должен устанавливать fSock = 0, если closesocket (fSock) возвращает SOCKET_ERROR. Или есть ли другая причина?
Мой код:
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;
}
Zero не является недопустимым значением для сокета. Если вы хотите указать, что fSock больше не является допустимым сокетом, вы должны установить его вместо INVALID_SOCKET, а не 0, потому что INVALID_SOCKET по определению является значением, которое никогда не будет использоваться действительным сокетом. –