Linux 不允许创建足够的套接字,但使用的套接字不多

Linux isn't allowing to create enough sockets but not many sockets are being used

我的 C++ 应用程序创建了 64-128 个 UDP 套接字。

它使用以下代码创建套接字:

int sock = socket(AF_INET, SOCK_DGRAM, 0);
assert(sock != -1, strerror(errno));

const u_int yes = 1;
int result = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
printf("sock=%i result=%i errno=%i\n", sock, result, errno);
if(result != 0)
{
    FATAL(strerror(errno));
}

但是,目前它只创建了 2 个套接字,因为 setsockopt() returns -1 在第三个请求中:

sock=1023 result=-1 errno=0

(stderror(errno) 只是说 success)

我很困惑,因为当我 运行 ss 时,看起来并没有很多套接字在使用中:

ss -s
Total: 238
TCP:   85 (estab 16, closed 40, orphaned 0, timewait 37)

Transport Total     IP        IPv6
RAW       2         1         1        
UDP       24        17        7        
TCP       45        30        15       
INET      71        48        23       
FRAG      0         0         0 

我的理解是你可能有 1023 个套接字。所以以上暗示我应该能够创建 64-128?

How/what是这里的问题吗?

打开套接字的数量没有限制,但对打开的文件描述符的数量有更一般的限制。它在 fd=1023 上失败的事实表明这个限制确实达到了,因为在典型的 Linux:

  1. 文件描述符被分配以 0 开头的连续编号
  2. 默认限制 (ulimit -n) 是 1024 个打开的文件描述符

您可以使用 ls -l /proc/<pid>/fd | wc -l 检查打开的文件描述符的数量。我怀疑您有很多打开的(常规)文件。