实例说明listen()函数第二个参数的意义与用法
来源:互联网 发布:c socket 端口复用 编辑:程序博客网 时间:2024/05/16 14:05
我们先来看结果:
Client:
#include <sys/socket.h>#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <stdlib.h>#include <arpa/inet.h>int main(int argc,char** argv){int ret;int sockfd = socket(AF_INET,SOCK_STREAM,0);if (sockfd == -1){printf("socket error\n");return -1;}struct sockaddr_in serveraddr;memset(&serveraddr,0,sizeof(serveraddr));serveraddr.sin_family = AF_INET;inet_aton(argv[1],&serveraddr.sin_addr);serveraddr.sin_port = htons((unsigned short)(atoi(argv[2])));ret = connect(sockfd,(const sockaddr*)&serveraddr,sizeof(serveraddr));if (ret == -1){printf("connect error,ret = %d\n",ret);return -1;} for(;;){}return 0;}
#include <sys/socket.h>#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <stdlib.h>#include <arpa/inet.h>int main(int argc,char** argv){int ret;int listenfd = socket(AF_INET,SOCK_STREAM,0);if (listenfd == -1){printf("socket error\n");return -1;}struct sockaddr_in serveraddr;memset(&serveraddr,0,sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);serveraddr.sin_port = htons((unsigned short)(atoi(argv[1])));ret = bind(listenfd,(const sockaddr*)&serveraddr,sizeof(serveraddr));if (ret == -1){printf("bind error,ret = %d\n",ret);return -1;} int backlog = atoi(argv[2]);ret = listen(listenfd, backlog);printf("backlog = %d,ret =%d\n",backlog,ret);if (ret == -1){printf("listen error,ret = %d\n",ret);return -1;}for(;;){}return 0;}server的代码中通过命令行的方式传入backlog的值,以便于我们通过修改backlog来观察不同的backlog对程序的影响.
开启一个server与3个client.
backlog = 1时:
backlog = 2时:
观察上图,server在19890端口监听,3个client发起TCP连接。在第一幅图中,对client而言,3个状态均为established.对server而言,2个连接状态为established,一个为syn_recv.第二幅图中,对server而言,3个链接的状态均为established。
我们先来看一下TCP连接的状态转换
再说回listen(int fd,int backlog)函数,内核会为一个监听套接字维护两个队列,当有TCP请求到来时,即3次握手中的syn分节发送来时,会在未完成队列中增加一项,3次握手完成时,未完成队列中的项就移动到已完成队列里,accept()函数会从已连接队列里取走已完成连接.
这个backlog参数就是控制我们的已连接队列里等待accept()取走的连接的最大数目的.注意一点,backlog与这个已排队连接的最大数目未必是完全相等的,不同的系统的实现可能不同.比如backlog=1,系统允许的实际一排队数目可能为2.
所以在上图中,对client而言,connect()返回,TCP的状态就转变为established。而对server而言,3次握手完成TCP状态才会转换为established。在图一中,由于backlog参数的限制,导致有一条连接并未完成3次握手,所以状态为syn_recv。
- 实例说明listen()函数第二个参数的意义与用法
- 实例说明listen()函数第二个参数的意义与用法
- 实例说明listen()函数第二个参数的意义与用法
- Listen第二个参数的意义
- Listen第二个参数的意义
- listen第二个参数的意义
- Listen第二个参数的意义
- Listen第二个参数的意义
- listen函数中backlog参数的意义
- tcp 套接字编程 listen 函数第二个参数理解
- 关于Linux socket编程之listen函数的第二个参数backlog.
- kmalloc第二个参数的意义
- listen的参数backlog的意义
- 关于listen的第二个参数backlog的一些问答见解
- 关于listen的第二个参数backlog的一些问答见解
- c++函数中参数是省略号的说明与用法
- int listen(int sockfd, int backlog) 第二个参数 解疑
- php setcookie函数参数说明与用法
- c# 闭包快多少?
- 一个tga工具
- sockaddr与sockaddr_in结构体简介
- 写在前面——说说我的故事
- objective-C运行时编程指南之类型编码
- 实例说明listen()函数第二个参数的意义与用法
- uva 11729 - Commando War(贪心)
- 庞果网在线编程之最长有效括号长度问题ruby解答
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事
- UVa 306 / POJ 1026 / Central Europe 1995 Cipher (置换群)
- 剑指Offer详解之左旋转字符串
- fzu 1753 Another Easy Problem(n!的素因子分解)
- 编程面试的10大算法概念汇总
- python exception