【发布时间】:2017-02-18 18:45:33
【问题描述】:
我有多线程应用程序,它定期轮询数百个设备。 每个线程为一个设备服务,它的套接字和其他描述符被封装在单独的对象中,因此没有共享描述符。 当我尝试将描述符 fSock 设置为 0 时,有时应用程序在 closesocket(fSock) 后崩溃。
我假设,如果 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 是一个永远不会被有效套接字使用的值。