繁体   English   中英

为什么 socket(AF_.NET, SOCK_STREAM, 0) 返回 1434,超过 1024,然后使程序崩溃

[英]why socket(AF_INET, SOCK_STREAM, 0) returns 1434, which is over 1024, then make program crash

当我在 Linux(ubuntu) 上调用 function 时:

socket(AF_INET, SOCK_STREAM, 0)

它返回 1434,大于 1024。

然后,程序在这里崩溃了:

fd_set read_fd;
FD_ZERO(&read_fd);
FD_SET(fd, &read_fd);

似乎 fd 超过 1024,而 FD_SETSIZE 宏只有 1024。因此,它会生成“检测到缓冲区溢出”核心转储。

我也写了一个demo c++程序:

#include <sys/socket.h>
#include <stdio.h>
int main() {
  int fd = socket(AF_INET, SOCK_STREAM, 0);
  printf("fd value is %d\n", fd);
  return 0;
}

程序的标准输出是:

fd value is 3

为什么 socket(AF_.NET, SOCK_STREAM, 0) 返回 1434,超过 1024

无论出于何种原因,库实现都必须返回此类描述符。 可能该程序试图同时打开超过 1024 个文件描述符。

简而言之,解决方案是根本不使用fd_set 您可能将其用于select 不要使用那个 API。使用已经取代它的 API 之一,例如poll 或者打开更少的文件描述符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM