今天在看eXosip代码的时候发现一个问题,在eXosip中使用TCP的socket实现了一个pipe管道,具体的原理是,打开一个TCP的socket然后设置成监听socket,再打开另一个socket作为pipe的一端向监听socket发起连接,监听socket经过accept后返回一个已连接socket,该socket作为pipe的另一端,这个很像用sockpair创建的socket对。但是我发现,在连接完成以后监听socket并没有关闭,带着这个疑惑我上网查了一些资料。

以下是我的理解(没有看过TCP的源代码,只是猜测)。TCP协议作为一个可靠的协议是有状态的,协议栈在每个连接上都维护了一个有限状态机来处理连接,上面是一个TCP的fsm的状态转移图,TCP会根据从IP层获取的包的TCP包头来匹配状态机实例(根据客户端的协议地址,即ip地址和端口号),然后将TCP包交给相应的状态机处理,如果没有匹配的状态机应该另作处理(比如发送reset)。在应用层创建一个listen的socket时应该会在相应的协议地址(bind的地址)上创建一个处于listen状态的状态机实例,这时如果有客户端发起连接请求(connect)时,当前状态机应该会产生一个新的状态机实例,并且处于SYN收到状态,之前的状态机会继续处于listen状态,新产生的状态机应该对应已连接队列中的一个半连接,当accept后会进入established状态,同时会产生一个新的套接字对应该状态机,即accept返回的套接字。此时如果关闭监听套接字,那么该套接字对应的状态机实例进入close状态后销毁,如果再有客户端发起connect请求时,由于没有处于listen状态的fsm实例来匹配该TCP包,因此会返回reset,但是之前创建的处于established状态的状态机实例还在,通信还能继续。根据以上的分析,在pipe完成连接后,关闭监听socket也不会影响pipe通信,但是在进程中打开fd的数目是有限制的,在不需要接受新的connect请求的情况下应该关闭监听socket以节省系统资源。

转载于:https://www.cnblogs.com/wangxuchu/archive/2012/10/04/2708707.html

socket的tcp连接中的监听套接字和已连接套接字相关推荐

  1. oracle本地连接地址,关于Oracle本地连接出现与监听有关的问题的解决方法探讨,oracle本地连接...

    关于Oracle本地连接出现与监听有关的问题的解决方法探讨,oracle本地连接 关于Oracle本地连接出现与监听有关的问题的解决方法探讨 监听的作用: 用于应用桌面即用户与数据库服务器建立连接的媒 ...

  2. ORA-12518: TNS: 监听程序无法分发客户机连接

    在团队成员增多时,经常出现"无法分发客户端连接"等问题.在网上搜索一番后,最终解决了该问题,现将解决方案总结如下,以供参考和以后备用. 原因:团队成员增多,原有数据库设置不够用,导 ...

  3. android hdmi 监听,对于HDMI设备连接状态的监听

    对与最近主要做的是电视机盒子端的开发,其中涉及到设备的状态监听比较繁琐,所以对HDMI的连接状态的监听方法做个记录,方便后续查看. 主要通过两种方式: (1)比较常用的广播监听 注册一个动态广播来获取 ...

  4. Navicat连接oracleTNS无监听程序解决方法

    Navicat连接oracleTNS无监听程序解决方法 之前已经遇到过一次这个问题,这一次又遇到了忘记咋解决了,所以决定记下来: navicat连接出现TNS无监听程序解决步骤: 1.去找到liste ...

  5. Oracel数据库连接时出现:ORA-12518:监听程序无法分发客户机连接

    在连接Oracel数据库时,每隔一段时间就会出现:ORA-12518:监听程序无法分发客户机连接,如图 上网查了资料原因和解决方案如下: 一.[问题描述] 最近,在系统高峰期的时候,会提示如上的错误, ...

  6. 连接数据库出现ORA-12518: TNS: 监听程序无法分发客户机连接错误

    系统(.NET开发)连接oracle 10g 数据库出现 信息:ORA-12518: TNS: 监听程序无法分发客户机连接 对象:ZFSoft 方法:Boolean LoadFromSql(Syste ...

  7. 关于“ORA-12518: TNS: 监听程序无法分发客户机连接”的一种解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 问题场景:昌平的服务器修改了静态ip,并重启了几次机器,后来在实验室通过远程桌面访问oracle数据库,发现sql devel ...

  8. android 连接蓝牙键盘事件监听

    记一次通过蓝牙键盘触发事件,在对应的Activity复写onKeyUp每次按键或长按保证只触发一次 @Overridepublic boolean onKeyUp(int keyCode, KeyEv ...

  9. java怎么快速创建监听类_java_利用java监听器实现在线人数统计,1.在工程中创建监听类SessionLi - phpStudy...

    利用java监听器实现在线人数统计 1.在工程中创建监听类SessionListener 并且实现HttpSessionListener接口,代码如下 import javax.servlet.htt ...

  10. Java中事件监听机制

    Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...

最新文章

  1. 图像配准的前世今生:从人工设计特征到深度学习
  2. BASH SHELL 脚本基础
  3. Spring Boot 中使用 Hikari,给我整不会了
  4. 如何使用 jMeter CSV Data Set config
  5. protobuf 数据解析的2种方法
  6. 推荐几个练习听力不错的国外网站
  7. PL/SQL异常处理
  8. 工作中常用到的ES6语法
  9. FreeWheel业务系统微服务化过程经验分享
  10. python中文怎么读-python的读法
  11. 多速率多传感器数据融合估计(二)
  12. 玩转木浪云数据管理免费版使用篇之内容搜索与颗粒度恢复
  13. 《iOS 6核心开发手册(第4版)》——1.13节秘诀:从滚动视图中拖动
  14. IE11 0x2ee4 bug 以及类似问题解决方法
  15. 如何查看Spark日志与排查报错问题
  16. 常用输入法快速输入自定义格式的时间和日期(搜狗/QQ/手心/微软拼音)
  17. 5年单片机学习总结-ED China【转】
  18. Eclipes下载安装
  19. 第2章:几何方面:六边形面积
  20. 修改注册表来修改文件关联

热门文章

  1. linux 查看http连接等
  2. synchronize原理以及和CAS的浅层比较
  3. 老年代的更新机制_魔兽世界:60年代五大“远古”机制,这根胡萝卜,可是当年的神器...
  4. 远程连接linux主机_Linux远程桌面连接Windows
  5. 设计模式之GOF23观察者模式
  6. python解析多层json数据_python解析多层json操作示例
  7. linux中iso源码解压_Linux系统下iso文件的制作和解压以及加载
  8. 【cookie,session】cookie和session基础知识入门
  9. 服务器给文件权限命令,chmod命令详细用法设置文件的权限
  10. git 小札 - 流程总览