【问题标题】:Linux isn't allowing to create enough sockets but not many sockets are being usedLinux 不允许创建足够的套接字,但使用的套接字并不多
【发布时间】:2021-11-16 04:56:59
【问题描述】:

我的 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() 在第三个请求上返回 -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?

这里的问题是什么?

【问题讨论】:

  • 您粘贴的代码是否与产生您显示的输出的代码完全相同?

标签: c++ linux network-programming


【解决方案1】:

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

  1. 文件描述符被分配从 0 开始的连续数字
  2. 默认限制 (ulimit -n) 是 1024 个打开的文件描述符

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2017-12-05
    • 2011-09-22
    • 1970-01-01
    相关资源
    最近更新 更多