当前位置:  技术问答>linux和unix

关于listen的疑惑

    来源: 互联网  发布时间:2016-06-27

    本文导语:  最近发现在一个服务端程序中, 父进程调用了listen函数后, 将服务端的socket句柄放在共享内存中, 随后fork出若干个子进程, 之后退出了... 子进程的处理函数中先对共享内存中的监听句柄调用了accept接受客户端的链接...

最近发现在一个服务端程序中, 父进程调用了listen函数后, 将服务端的socket句柄放在共享内存中, 随后fork出若干个子进程, 之后退出了...

子进程的处理函数中先对共享内存中的监听句柄调用了accept接受客户端的链接, 随后是一堆业务处理的函数....

这个程序采用的是长连接的机制, 按本人的理解, 子进程中一旦断开了连接, 由于调用listen的主进程已经退出, 那么重新accept将会一直阻塞

但是奇怪的是子进程发生通讯异常时断开, 重新accept竟然可以接收到客户端的connect请求, 并且我用lsof -p命令查看子进程时, 竟然发现每个子进程都在监听指定的端口...

请问有哪位大侠知道这是为什么吗? 难道一个listen调用后只要服务端的socket句柄不关闭, 即使主进程退出了也依然可以从监听队列中取到connect请求吗?

叩谢....

|
你先搞清楚socket和accept返回的2个fd分别是干吗的,这样就能理解了。
socket返回一个fd,为后续建立监听队列做准备。
而Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。
处理它的函数就是accept咯,它会处理连接请求,并返回一个用于现有tcp连接的fd.

其实你看看客户端connect为何是阻塞就知道了,在你accept之前,connect是一直阻塞的。Listen只是服务器的一个中间处理过程。

具体的看看这里:
http://blog.csdn.net/hairetz/archive/2009/05/29/4223219.aspx

其实都是些基础只是来的。

|
只要用来监听的文件描述没有关闭,这个文件描述符就一直在监听connect请求
你所说的异常关闭,关闭的是连结文件描述符(accept返回的用与通信的文件描述符),而不是监听用的文件描述符(bind函数设置的文件描述符),所以这个文件描述符还是在监听的。
不知道我的理解对不对,仅供参考

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.xml.bind类marshaller.listener的类成员方法: marshaller.listener定义及介绍
  • android中如果为listview的item添加listener,也能为item中的button添加listener
  • java命名空间javax.xml.bind类unmarshaller.listener的类成员方法: unmarshaller.listener定义及介绍
  • listen 1个端口和listen 多个端口那个效率更高一些
  • java命名空间javax.swing.undo类undoableeditsupport的类成员方法: listeners定义及介绍
  • 初学socket,求教关于listen和accept关系的问题。
  • java命名空间java.net类socketimpl的类成员方法: listen定义及介绍
  • Select和listen函数的区别
  • java命名空间javax.management.modelmbean接口modelmbeannotificationbroadcaster的类成员方法: removeattributechangenotificationlistener定义及介绍
  • oracle9i中的listener
  • java命名空间javax.xml.bind类marshaller.listener的类成员方法: aftermarshal定义及介绍
  • 关于listen的问题
  • java命名空间javax.management.modelmbean类requiredmodelmbean的类成员方法: removeattributechangenotificationlistener定义及介绍
  • 关于如何notify事件给所有的Listeners.
  • java命名空间javax.xml.bind类unmarshaller.listener的类成员方法: afterunmarshal定义及介绍
  • 不属于任何进程的LISTEN状态的socket如何退出?
  • Linux下如何启动oracle的Listener服务??
  • 如何修改VNC Server的Listen Port?
  • 请问listen函数的执行过程
  • 请问listen函数中最大队列的问题
  • 如何配置 linux 下 oracle 的 listener .ora 和


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3