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

标签 linux networking sockets reusability file-descriptor

在下面的服务器代码中调用套接字后,我收到错误“太多打开的文件”。这段代码被重复调用,它只在 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)

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

谢谢。

最佳答案

使用 --track-fds=yes 选项在 valgrind 下运行您的程序:

valgrind --track-fds=yes myserver

如果您的程序使用包装器或将自身置于后台,您可能还需要 --trace-children=yes

如果它没有自行退出,中断它或使用“kill pid”终止进程(不是 -9) 在它积累了一些泄漏的文件描述符之后。退出时,valgrind 将显示仍然打开的文件描述符以及与创建它们的位置相对应的堆栈跟踪。

strace 下运行您的程序以记录所有系统调用也可能有帮助。另一个有用的命令是 /usr/sbin/lsof -p pid 以显示所有当前使用的文件描述符及其用途。

关于linux - 套接字和文件描述符重用(或缺乏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232482/

相关文章:

regex - 如何在 shell 脚本中使用正则表达式从 URL 中提取字符串字段值?

linux - 对不报告的 xymon 客户端进行故障排除

java - 使用字节掩码防止符号扩展

ios - 从 iOS 应用程序到服务器的 SSL 通信

c# - 适用于 Windows 和 Linux 的同一台机器上的套接字

c++ - 套接字发生了什么,当另一端关闭它时?

android - 蓝牙错误没有广告设备

SOCK_DGRAM 上的 Linux 抽象套接字拒绝连接

linux - 将 Oracle 从 Solaris 迁移和升级到 Linux,包括存储过程

linux - Bash 管道和 SIGTERM