我遇到一个问题,即返回的文件描述符会逐渐增加到大于 FD_SETSIZE
的数字。
我的 tcp 服务器不断关闭,这需要我的客户端关闭套接字并重新连接。然后,客户端将尝试通过调用 socket
重新连接到服务器,以在调用 connect
之前获取新的文件描述符。
然而,每次我调用 socket
时,返回的文件描述符都会递增,并且在一定时间后它变得大于 FD_SETSIZE
,这是我遇到的问题使用select
来监控套接字。
是否可以为 connect
调用重用从 socket
返回的第一个文件描述符,即使套接字已关闭?或者还有其他解决方法吗?
重新连接代码(循环直到连接):
int s = getaddrinfo(hostname, port, &hints, &result);
if (s != 0) { ... HANDLE ERROR ...}
...
struct addrinfo *rp;
int sfd;
for (rp = result; rp != NULL; rp -> ai_protocol)
{
sfd = socket( rp->ai_family, rp->ai_sockettype, rp->ai_addrlen);
if (sfd >= 0)
{
int res = connect(sfd, rp->ai_addr, rp->ai_addrlen);
if (res != -1)
{
_sockFd = sfd;
_connected = true;
break;
}
else
{
close (sfd);
break;
}
}
}
if (result != NULL)
{
free(result);
}
读取消息代码:
if (_connected)
{
...
retval = select(n, &rec, NULL, NULL, &timeout);
if (retval == -1)
{
...
_connected = false;
close(_sockFd);
}
else if (retval)
{
if (FD_ISSET(_sockFD, &rec) == 0)
{
....
return;
}
int count = read(...)
if (count)
{
....
return;
}
else
{
....
_connected = false;
close(_sockFd);
}
}
}
最佳答案
如果连接失败,您不会关闭套接字。所以它保持打开状态,占用一个 FD,所以下次你调用 socket() 时你会得到一个新的 FD。当 connect() 成功时,您也没有跳出循环,这是另一个漏洞。您也没有检查 read() 的结果是否为 -1。
关于c++ - 从套接字返回的文件描述符大于 FD_SETSIZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442636/