我的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=%in", 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?
这里有什么问题?
对打开的套接字数量没有限制,但对打开的文件描述符数量有更一般的限制。在fd=1023上失败的事实表明,这个限制确实达到了,因为在典型的Linux上:
- 文件描述符被分配以0开始的连续数字
- 默认限制(
ulimit -n
)是1024个打开的文件描述符
您可以使用ls -l /proc/<pid>/fd | wc -l
检查打开的文件描述符的数量。我怀疑你有很多打开的(常规)文件。