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



我的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上:

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

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

最新更新