[英]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.