套接字和文件描述符重用(或缺乏)

5 sockets linux networking file-descriptor reusability

在下面的服务器代码中调用套接字后,我收到错误“打开文件过多”。此代码被重复调用,并且仅在 server_SD 获取值 1022 之后发生。因此我假设我达到了“ulimit -n”所禁止的 1024 限制。我不明白的是我正在关闭套接字,这应该使 fd 可重用,但这似乎没有发生。

注意:使用linux,是的,客户端也被关闭,不,我不是root用户,所以移动限制不是一个选项,我应该一次最多打开20个(左右)套接字。在我的程序的生命周期中,我期望打开和关闭接近 1000000 个套接字(因此需要非常强大的重用)。

  server_SD = socket (AF_INET, SOCK_STREAM, 0);  
  bind (server_SD, (struct sockaddr *) &server_address, server_len)  
  listen (server_SD,1)  
  client_SD = accept (server_SD, (struct sockaddr *)&client_address, &client_len)  
  // read, write etc...   
  shutdown (server_SD, 2);  
  close (server_SD)
Run Code Online (Sandbox Code Playgroud)

有谁知道如何保证关闭和可重用性?

谢谢。

ire*_*ses 0

也许您的问题是您没有指定 SO_REUSEADDR 标志?

套接字联机帮助页:

SO_REUSEADDR 指示用于验证bind(2) 调用中提供的地址的规则应允许重用本地地址。对于 PF_INET 套接字,这意味着套接字可以绑定,除非有一个活动的侦听套接字绑定到该地址。当侦听套接字绑定到具有特定端口的 INADDR_ANY 时,就不可能为任何本地地址绑定到该端口。