gpt4 book ai didi

c++ - 从套接字返回的文件描述符大于 FD_SETSIZE

转载 作者:太空宇宙 更新时间:2023-11-04 08:59:32 26 4
gpt4 key购买 nike

我遇到一个问题,即返回的文件描述符会逐渐增加到大于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com