我的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));
}但是,目前它只创建两个套接字,因为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?
这里有什么问题?
发布于 2021-09-22 18:15:18
对打开的套接字数量没有限制,但对打开的文件描述符的数量有更一般的限制。它在fd=1023上失败的事实表明,这个限制确实受到了影响,因为在一个典型的Linux上:
ulimit -n)是1024打开的文件描述符您可以使用ls -l /proc/<pid>/fd | wc -l检查打开的文件描述符的数量。我怀疑你有很多打开(常规)的文件。
https://stackoverflow.com/questions/69289061
复制相似问题