#include <sys/socket.h>int listen(int s, int backlog);
  • listen的第一个参数为待监听的套接字,第二个参数是已连接队列的大小。

listen函数调用后本质会维护两个队列,一个是半连接状态的,一个是已完成连接队列,再unix网络编程中提及listen的第二个参数是维护的两个队列之和,如果你使用man手册查看之后就会有新的认识。

半连接队列的大小通过man手册我们知道可以任意修改,但是是不是通过参数给多少,已完成队列就是多大呢?
答案是:已完成队列的真是大小在centos下是你所给参数的值+1;

## 代码验证

// 服务端
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>#define PORT 8080int main()
{int listenfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(listenfd < 0){perror("socket");return -1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(PORT);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                addr.sin_addr.s_addr = inet_addr("0.0.0.0");int ret = bind(listenfd,(struct sockaddr*)&addr,sizeof(addr));if(ret < 0){perror("bind");close(listenfd);return -1;}ret = listen(listenfd,1);if(ret < 0){perror("listen");close(listenfd);return -1;}sleep(15);printf("i will accept one\n");accept(listenfd,NULL,NULL);while(1){sleep(1);}return 0;
}
//客户端#include <stdio.h>    #include <unistd.h>    #include <sys/socket.h>    #include <arpa/inet.h>    #include <netinet/in.h>    #include <pthread.h>    #define PORT 8080    #define pthreadnum 5   struct sockaddr_in addr;    W>void* func(void* arg)    {    int sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    if(sockfd < 0)    {    perror("socket");    return NULL;    }    connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));    while(1)    {}    return NULL;    }    int main()    {    addr.sin_family = AF_INET;    addr.sin_port = htons(PORT);    addr.sin_addr.s_addr = inet_addr("192.168.40.131");    pthread_t tid[pthreadnum];    for(int i = 0;i<pthreadnum;i++)    {    pthread_create(&tid[i],NULL,func,NULL);    }    for(int i = 0;i<pthreadnum;i++)    {    pthread_join(tid[i],NULL);    }    return 0;    }                                                                                                                                                                                                                                                                                                                                                                   


结果分析:我自己设置的listen的第二个参数是1,但是已完成连接队列中的个数为二。

网络编程之listen深入剖析相关推荐

  1. linux网络编程之Listen函数参数介绍

    1.listen()函数介绍 listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器, ...

  2. 网络编程之listen与bind

    今天根据<Unix 网络编程>(卷1)第四章的4.4和4.5的习题要求:尝试把服务端的listen和bind分别去掉,看看会发生什么 首先把listen去掉,然后我发现我竟然这么做了,开始 ...

  3. 网络编程之 listen()函数的使用与三次握手的理解

    listen()函数 在进入我们的函数讲解前大家再回顾一下编写服务器端的流程 服务器端:socket()-->bind( )-->listen()-->accept()-->r ...

  4. 网络编程之listen函数

    基本TCP客户端/服务器程序的套接字函数 listen函数仅由TCP服务调用,它做两件事 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect连接的 ...

  5. 网络编程之socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  6. iOS网络编程之Socket

    [深入浅出Cocoa]iOS网络编程之Socket 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 更多 Cocoa 开发文章,敬请访问<深入浅 ...

  7. Python中的网络编程之TCP

    Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...

  8. Python中的网络编程之UDP

    Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...

  9. Python之路 - 网络编程之Socket

    Python之路 - 网络编程之Socket C/S架构 ? Socket ? 基于TCP ? 基于UDP ? Socket对象方法 ? C/S架构 ? 在网络通信中 , 一般是一方求一方应 , 求的 ...

最新文章

  1. 可视化太酷辽!一文了解排序和搜索算法在前端中的应用
  2. 【解决】-bash: ftp: command not found
  3. learnpythonthehardway下载_Python【十一】:阶段小结
  4. EV: repl.it - A Wonderful JavaScript Console
  5. python编译器_11 个最佳的 Python 编译器和解释器
  6. Pythonic:递归、回溯等5种方法生成不重复数字整数
  7. HTML5的表单验证属性--pattern
  8. SWPUACM第一届程序设计大赛
  9. c#语言asp.net实现treeview控件读数据库动态生成树的代码
  10. linux 注册并配置
  11. 帝云CMS内容管理系统
  12. 联想计算机睡眠如何唤醒,笔记本电脑休眠和睡眠如何唤醒
  13. 每日内涵微信小程序-2-轮播图圆角
  14. ESP32 nvs 加密
  15. 个人Gmail跟MSN邮箱账号,怕忘记
  16. An attempt was made to call a method that does not exist. The attempt was ma
  17. HTML简约导航源码
  18. 输出2到100之间的所有素数(质数)之和(c语言)
  19. SQL存储过程的递归调用
  20. Java 开发神器 Lombok 使用详解(转载)

热门文章

  1. 最长公共子序列 - 北京大学郭炜 动态规划代码详解
  2. 推荐算法对淘宝卖家数据分析的应用
  3. 2022-2027年中国维生素A行业市场调研及未来发展趋势预测报告
  4. 菜鸟系列Fabric源码学习 — 区块同步
  5. 学会这 11 条,你离 Git 大神就不远了!
  6. 企业即时通讯的市场格局
  7. 手掌是人体健康的晴雨表
  8. 游戏android还未上线,堡垒之夜手游外服现已上线 一分钟FAQ教你快速玩到游戏
  9. mobius HDOJ 5468 Puzzled Elena
  10. 数据科学家应该掌握的12种机器学习算法