在做网络编程的时候,碰到一个监听套接字的问题,在这里大概描述一下:比如我的程序开了一个监听端口,与客户端建立连接之后,生成了一个新套接字。这时我执行了只关闭监听端口的语句,结果却发现监听端口和已建立的连接仍然存在。我都已经关闭了监听套接字,为什么客户端还可以继续往监听端口发信息?这到底是因为什么呢?新套接字和监听套接字有什么关系呢?

比如,你开了80监听端口,有一个客户连接你accept了,这时关闭80端口。但此时客户端发信息的时候 必然是发向80断口,但是80已经关了啊,但是通信依然正常进行。其实我刚接触套接字的时候也是认为所有从客户端发来的数据都需要经过监听套接字转一下才能收到。所有的初学者都容易犯这个误解。

经过一段时间的使用,我现在是明白了,监听套接字就是个牵线指路的,你实质上是跟它指的那个人说话。因为你要找的那个人不可能随时等你来,而监听套接字就是专职等你来问,它回答你要找的人在哪,并唤醒你要找的人,于是通话就建立起来了,就像现实生活中的接线员一样。也就是说,在连接建立后,客户端用发出连接的那个SOCKET向服务器发数据,是发给服务器新创建的SOCKET,而不是服务器的监听SOCKET。服务器的监听SOCKET永远只是用来接受连接请求。

这就好比你去吃饭,饭馆门口有迎宾小姐(监听SOCKET)看到你来后和你打招呼,然后(ACCEPT)找来一个新的服务员(NEW SOCKET)来接待你,然后守在门口继续监听下一个。监听的小姐走了,接待你的服务员当然不受影响。

说到这里有必要说一下accept()函数。以下是《Linux网络编程》一书,第六章 Berkeley套接字对accept()函数的描述:

函数 accept()有一些难懂。当调用它的时候,大致过程是下面这样的:

●有人从很远很远的地方尝试调用 connect()来连接你的机器上的某个端口(当然是你已经在 listen()的)。

●他的连接将被 listen 加入等待队列等待 accept()函数的调用(加入等待队列的最多数目由调用 listen()函数的第二个参数 backlog 来决定)。

●你调用 accept()函数,告诉他你准备连接。

● accept()函数将回返回一个新的套接字描述符,这个描述符就代表了这个连接!

好,这时候你有了两个套接字描述符,返回给你的那个就是和远程计算机的连接,而第一个套接字描述符仍然在你的机器上原来的那个端口上 listen()。

这时候你所得到的那个新的套接字描述符就可以进行 send()操作和recv()操作了。

通过上面的解释,相信您一定已经对监听套接字有了进一步的了解了吧

作者:王老师,华清远见嵌入式学院讲师。

关于监听套接字的形象解释相关推荐

  1. C语言socket accept()函数(提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符)

    文章目录 名称 使用格式 功能参数描述 参数 sockfd addr addrlen 返回值 示例 man 2 文档中的accept解释 错误处理 名称 accept() 接收一个套接字中已建立的连接 ...

  2. linux套接字端口,多端口监听套接字linux(multiport listening socket linux)

    多端口监听套接字linux(multiport listening socket linux) 我正在用C(linux)编写一个多线程服务器应用程序,它必须监听2个不同的端口号,例如监听端口号3000 ...

  3. nginx源码分析:打开监听套接字的流程

    问题源于在分析nginx的源码时,找了半天没有找到nginx是怎么把监听套接字读事件添加到事件循环中的,后经过仔细的分析,终于搞明白,于是记录一下. 在上一篇module机制中介绍了nginx添加mo ...

  4. 监听套接字 连接套接字的区别

    摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的.它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户 ...

  5. linux epoll监听套接字实例

    linux epoll机制用于IO多路复用,能够同时监听多个接字,使用起来比较简单. 相关接口: #include <sys/epoll.h>int epoll_create(int si ...

  6. TCP和UDP套接字编程

    一.Socket简单介绍 如果要在应用层调用传输层的服务,进行相关程序的设计,就要涉及到套接字编程.套接字也称之为Socket,本质上它就是利用传输层提供的一系列Api来进行网络应用程序的设计. 网络 ...

  7. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  8. Linux网络编程 - 套接字与协议族

    一 理解网络编程和套接字(socket) 1.1 网络编程和套接字概要 网络编程就是编程程序使两台连网的计算机可以互相交换数据.那么,这两台计算机之间用什么传输数据呢?首先需要物理连接.如今大部分计算 ...

  9. oracle 监听程序当前无法识别连接描述符中请求的服务_Go 中的优雅升级

    优化升级背后的想法是在进程运行过程中,在用户无感知的情况下对程序的配置和代码进行更换(升级).尽管这听起来很危险.容易出错.不可取,并且像是一个馊主意 - 事实上我(的想法)和你一样. 但是,有些时候 ...

  10. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

最新文章

  1. jQuery Mobile开发1-UI components
  2. 通风与防排烟工程电子书_暖通、通风、防排烟风管如何做抗震设计呢?
  3. python关键字是什么颜色,python – Matplotlib:如果使用关键字sym,则使用Boxplot异常值颜色更改...
  4. Tomcat虚拟主机配置
  5. python爬虫常见的那点问题!
  6. 编译安装openresty+mysql+php7
  7. SAP C4C产品主数据OData服务的ETag处理
  8. python去重复元素_python 去除单个list中的重复元素
  9. aes key长度_AES加密(1): 基本AES算法
  10. php if多条件_PHP的数据类型
  11. C++ newdelete
  12. (转载)C#提取汉字拼音首字母的方法
  13. go详解bufio包
  14. Activiti 工作流变量的修改方法
  15. pytorch 中 torch.optim.Adam 方法的使用和参数的解释
  16. Apache Tomcat部署多个项目
  17. 【重点】剑指offer——面试题65:滑动窗口的最大值
  18. 六石管理学:人是不可以被说服的,除非自己想明白
  19. Linux桌面系统远程访问全解析
  20. JDK1.8 List转Map

热门文章

  1. SQL server 增、删、改代码
  2. Android Button 实现透明 + 圆角按钮效果
  3. 如何使用kafka增加topic的备份数量,让业务更上一层楼
  4. 29.3 用户模式构造
  5. SEO要领:8文章主持技巧(两)
  6. 终于购入Mac mini,发现HDMI接口与显示器不兼容,网购了一个VGA转换插头
  7. IE8不能上传、插入图片的解决办法!
  8. 思科EIGRP配置及基本讲解
  9. 网管学习日记-三层交换机
  10. mysql数据库登录历史_mysql数据库查看历史记录