close掉socket后,在accept了1024次后,出现打开文件最大限制1024的问题

tang_go 2007-10-19 05:27:48
我的一个服务器程序在循环accept来自客户端的连接,

建立连接,处理完该处理的事情后,close掉该socket,

当accept到1024次后,无法再accept连接了。

通过ulimit -n,sysctl来修改最大限制也意义不大,这是服务器啊,一直不关机,总会有一天打开到最大限制的

我觉得可能还是close的问题,但不知道原因在哪里?
...全文
481 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
daidodo 2007-11-07
  • 打赏
  • 举报
回复
服务器一般不主动close掉连接,而是由client发起close,服务器响应close。
除非client出现错误或问题(包括client发起close)。
这是写服务器的基本原则。
mymtom 2007-10-25
  • 打赏
  • 举报
回复
还是怀疑没有正确close
mymtom 2007-10-25
  • 打赏
  • 举报
回复
如果是server主动关闭,这个tcp connection将处于TIME_AWAIT状态,在这个时间内不会马上close(),所以还占用文件描述符位置
====
还占用文件描述符么?有点怀疑,没有试验过,这几天太忙,有时间试验一下!
lauxp 2007-10-25
  • 打赏
  • 举报
回复
你是根据什么条件close()的呢
是server主动关闭还是客户端关闭你才关闭
如果是server主动关闭,这个tcp connection将处于TIME_AWAIT状态,在这个时间内不会马上close(),所以还占用文件描述符位置
建议你netstat -an | grep port 看看connection 的状态
mymtom 2007-10-24
  • 打赏
  • 举报
回复
楼主可否把代码贴上来?
pinelinda 2007-10-23
  • 打赏
  • 举报
回复
client_sock = accept( server_sock,...);
...
close(client_sock);
...中有没有异常的continue,而没有close
t_mac_chen 2007-10-22
  • 打赏
  • 举报
回复
服务器的ram有多大?还有好像linux默认最大连接数是1024,要彻底修改连接数,得重新编译内核/include/linux/fs.h
tang_go 2007-10-22
  • 打赏
  • 举报
回复
确定调用了close()

我每次在调用close()之前打印了client_sock,

从1变到1023,之后就死掉了
NC 2007-10-22
  • 打赏
  • 举报
回复
close后看看端口状态.确认下客户端是不是也close了?
hilary0810 2007-10-20
  • 打赏
  • 举报
回复
这样做不好,兄弟
先用select看是否有可读取数据,若>0则再运行accept
tengulre 2007-10-20
  • 打赏
  • 举报
回复
大量的socket连接建议用epoll! 简单适用
chairou 2007-10-20
  • 打赏
  • 举报
回复
gdb一下,看看是否有调close(),估计没有运行到close()就跳出循环
tang_go 2007-10-20
  • 打赏
  • 举报
回复
重点不在accept,是在close后,socket资源为什么不释放呢?
cceczjxy 2007-10-20
  • 打赏
  • 举报
回复
进入/proc/pid/fd内,ls -l看看都是那些没关闭就是了。(pid问进程号)
tang_go 2007-10-19
  • 打赏
  • 举报
回复
程序结构是这样的:
listen(server_sock,...)
while(1)
{
client_sock = accept( server_sock,...);
...
close(client_sock);
}

client_sock到1023之后,再也连接不了,报错:Too many open files

我可以肯定,在循环体里,绝对释放了所有打开的文件句柄

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧