免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3091 | 回复: 3
打印 上一主题 下一主题

[网络] close套接字后继续accept返回的套接字值不是刚关闭的描述符的值 [复制链接]

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-27 23:03 |只看该作者 |倒序浏览
如题,我使用线程池+epoll做了一个服务器端。
    客户请求连接,accept返回一个套接字值为13,加入epoll监听,客户请求到来epoll返回事件,服务器处理完后将结果写入套接字13,线程继续等待请求到来。直到当客户请求下线后服务器端调用close关闭套接字13,服务器继续等待。接着第二个客户链接到来时,accept返回一个套接字值为14,然后如上继续处理返回,最后调用close关闭。然后不断重复,套接字值不断自增1!试验环境都是同时只有一个客户端连接服务器的。
    问题就是为什么系统没有立即重用刚关闭的套接字,而如果没有客户端连接的情况下,让服务器端静止1分钟左右,在让客户端发起一个连接,这时返回的套接字值是13,然后如果继续前述的操作结果也是套接字值自增。
    但是,
    我在另一个试验中使用只使用线程池没有使用epoll,当我使用一个客户端不断发起一个连接请求,服务器端处理后返回给客户端,然后服务器关闭该连接,客户端接着发起连接。此时系统却可以
很快的马上使用刚关闭的套接字(从套接字的值来看,即值相等的套接字)。不会出现不断自增的情况。

    这是为什么呢?如何避免显式关闭套接字后accept返回的套接字值自增,而不是重新利用刚关闭的套接字?

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
2 [报告]
发表于 2014-11-28 21:55 |只看该作者
顶下!顶下!

论坛徽章:
0
3 [报告]
发表于 2015-03-31 17:20 |只看该作者
1.你应该认真看看TCP/IP协议的理论基础,主动关闭和被动关闭经历哪些过程。
2.这跟你用不用epoll没有关系,如果服务器关闭了连接,而且客户端recv返回0,也关闭连接,那么就可以立刻重用,如果只是单方面的行为,那么就会出现你上面说的情况。
3.网络服务编程的原则性问题,一般服务器不要主动立刻去关闭连接,而是用定时器来处理,建议看看Nginx的处理。

论坛徽章:
0
4 [报告]
发表于 2015-03-31 17:20 |只看该作者
1.你应该认真看看TCP/IP协议的理论基础,主动关闭和被动关闭经历哪些过程。
2.这跟你用不用epoll没有关系,如果服务器关闭了连接,而且客户端recv返回0,也关闭连接,那么就可以立刻重用,如果只是单方面的行为,那么就会出现你上面说的情况。
3.网络服务编程的原则性问题,一般服务器不要主动立刻去关闭连接,而是用定时器来处理,建议看看Nginx的处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP