网络编程之listen深入剖析
#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深入剖析相关推荐
- linux网络编程之Listen函数参数介绍
1.listen()函数介绍 listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器, ...
- 网络编程之listen与bind
今天根据<Unix 网络编程>(卷1)第四章的4.4和4.5的习题要求:尝试把服务端的listen和bind分别去掉,看看会发生什么 首先把listen去掉,然后我发现我竟然这么做了,开始 ...
- 网络编程之 listen()函数的使用与三次握手的理解
listen()函数 在进入我们的函数讲解前大家再回顾一下编写服务器端的流程 服务器端:socket()-->bind( )-->listen()-->accept()-->r ...
- 网络编程之listen函数
基本TCP客户端/服务器程序的套接字函数 listen函数仅由TCP服务调用,它做两件事 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect连接的 ...
- 网络编程之socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- iOS网络编程之Socket
[深入浅出Cocoa]iOS网络编程之Socket 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 更多 Cocoa 开发文章,敬请访问<深入浅 ...
- Python中的网络编程之TCP
Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...
- Python中的网络编程之UDP
Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...
- Python之路 - 网络编程之Socket
Python之路 - 网络编程之Socket C/S架构 ? Socket ? 基于TCP ? 基于UDP ? Socket对象方法 ? C/S架构 ? 在网络通信中 , 一般是一方求一方应 , 求的 ...
最新文章
- 可视化太酷辽!一文了解排序和搜索算法在前端中的应用
- 【解决】-bash: ftp: command not found
- learnpythonthehardway下载_Python【十一】:阶段小结
- EV: repl.it - A Wonderful JavaScript Console
- python编译器_11 个最佳的 Python 编译器和解释器
- Pythonic:递归、回溯等5种方法生成不重复数字整数
- HTML5的表单验证属性--pattern
- SWPUACM第一届程序设计大赛
- c#语言asp.net实现treeview控件读数据库动态生成树的代码
- linux 注册并配置
- 帝云CMS内容管理系统
- 联想计算机睡眠如何唤醒,笔记本电脑休眠和睡眠如何唤醒
- 每日内涵微信小程序-2-轮播图圆角
- ESP32 nvs 加密
- 个人Gmail跟MSN邮箱账号,怕忘记
- An attempt was made to call a method that does not exist. The attempt was ma
- HTML简约导航源码
- 输出2到100之间的所有素数(质数)之和(c语言)
- SQL存储过程的递归调用
- Java 开发神器 Lombok 使用详解(转载)