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

标签 c++ linux sockets tcp

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

相关文章:

c++ - 返回类型 Pthread 使用 C++ 创建

递归 future 文件的 Linux "Default Permissions"?

linux - 想要使用 awk 根据顺序切换 2 个值

c++ - 用于简单消息的 XML C++ 库

c++ - 通过 tcp 传输的文件末尾的额外换行符

actionscript-3 - AS3向arduino发送长消息?

java - 如何检查在 C++ 中使用的 Java 版本

c++ - 模板类中特殊函数的声明

c++ - 使用 Boost 属性树将 Unicode 字符串写入 XML

linux - 需要高效且可能是一到两个衬里解决方案来替换空间