listen()函数中backlog参数分析
实例分析1
将服务器端的listen函数backlog设置为2,用20个客户端与服务器建立连接,查看连接的建立情况。
服务器代码:
#include <stdio.h>
#include<unistd.h>
#include<sys/types.h> /* basic system data types */
#include<sys/socket.h> /* basic socket definitions */
#include<netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include<arpa/inet.h> /* inet(3) functions */
#include<sys/epoll.h> /* epoll function */
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#include<stdio.h>
#include<string.h> int main(int argc,char*argv[])
{
int listenfd,connfd;
struct sockaddr_in cliaddr,servaddr;
int queuelen=; if(argc!=){
puts("usage# ./aworker listenqueuelen");
exit();
}
queuelen=atoi(argv[]); listenfd = socket(AF_INET,SOCK_STREAM,); bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); listen(listenfd,queuelen);
sleep(); //将这个注释,会出现另一种情况哟~~
while()
{
connfd = accept(listenfd,NULL,);
if(connfd == -)
{
perror("accept error");
continue;
}
puts("new connection...");
}
return ;
}
client代码
#include "client.h" //void cli_hander(int sockfd,) int main()
{
int sockfd;
int rc;
int cpid;
struct sockaddr_in servaddr; bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);
servaddr.sin_port = htons(); for(int i=;i<;i++)
{
cpid = fork();
if(cpid == )
{
sockfd = socket(AF_INET,SOCK_STREAM,);
rc = connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
if(rc == -)
{
perror("connect error");
exit();
}
printf("pid#%d connected...\n",getpid());
sleep();
close(sockfd);
exit();
}
} while()
{
cpid = wait(NULL);
if(cpid==-){
perror("end of wait");
break;
}
printf("pid#%d exit...\n",cpid);
}
return ;
}
实验结果
服务器端显示:
root@cloud2:~/slp/NetWrokProgram/server# ./aworker
new connection...
new connection...
new connection...
new connection...
new connection...
客户端显示:
root@cloud2:~/slp/NetWrokProgram/client# ./a.out
pid# connected...
pid# connected...
pid# connected...
pid# exit...
pid# exit...
pid# exit...
pid# connected...
pid# connected...
pid# exit...
pid# exit...
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
connect error: Connection timed out
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
end of wait: No child processes
结果分析:
同时建立连接的客户端进程共有20个,可是只有5个完成了连接的建立,其他15个没有成功。有趣的是,建立的5个链接中有3个是马上建立的,2个是过了一段时间后后来才建立的。
实例分析2
...
listen(listenfd,queuelen);
sleep(); //将这个注释,会出现另一种情况哟~~
while()
{
connfd = accept(listenfd,NULL,);
....
同样的运行服务端结果如下:
root@cloud2:~/slp/NetWrokProgram/server# ./aworker
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
new connection...
客户端
root@cloud2:~/slp/NetWrokProgram/client# ./a.out
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# connected...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
pid# exit...
end of wait: No child processes
转自:http://blog.csdn.net/ordeder/article/details/21551567
listen()函数中backlog参数分析的更多相关文章
- tcp/ip协议listen函数中backlog参数的含义与php-fpm的502 Bad Gateway
To understand the backlog argument, we must realize that for a given listening socket, the kernel ma ...
- tcp/ip协议listen函数中backlog參数的含义
listen函数的定义例如以下所看到的: #include <sys/socket.h> int accept(int sockfd, struct sockaddr * restrict ...
- TCP/IP协议中backlog参数
TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...
- TCP之三:TCP/IP协议中backlog参数(队列参数)
目录: <TCP洪水攻击(SYN Flood)的诊断和处理> <TCP/IP协议中backlog参数> TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(ac ...
- Python 函数中,参数是传值,还是传引用?
在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...
- Main函数中的参数argc,argv的使用简单解析
本篇文章是对Main函数中的参数argc,argv的使用进行了简单的分析介绍,需要的朋友参考下: C/C++语言中的main函数,经常带有参数argc,argv,如下: int main(int a ...
- vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置
vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...
- unserialize函数中的参数是否是污染数据
1.原理 在程序编写的时候,往往需要序列化一些运行时数据,所谓序列化就是按照一定的格式将运行时数据写入本地文件.这样做可以对数据进行本地保存,用的时候直接读文件就可以把运行时产生的数据读出.php中就 ...
- (转)Java程序利用main函数中args参数实现参数的传递
Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,J ...
随机推荐
- centos 打包报错License for package Android SDK Build-Tools 25.0.3 not accepted
报错如下: 提示没有25.0.3的安卓环境,那么,接下来就需要安装这个环境 1.android list sdk -a 会显示需要更新 类似如下(截图只是一部分,前后还有一部分): 2.android ...
- UX求职:FB和微软这些大佬公司看重的UX设计师技能,你还差几条?
最近是金三银四的求职季,当然,不管你是想求职跳槽,还是想不断充电学习升职加薪,总是要从优秀的一群人中学习. 本文依据 Facebook.微软.Booking 等互联网大佬公司的UX设计师访谈记录,整理 ...
- CentOS6.5 安装Spark集群
一.安装依赖软件Scala(所有节点) 1.下载Scala:http://www.scala-lang.org/files/archive/scala-2.10.4.tgz 2.解压: [root@H ...
- 29.html5 移动端开发总结
手机与浏览器 浏览器: 移动端开发主要针对手机,ipad等移动设备,随着地铁里的低头族越来越多,移动端开发在前端的开发任务中站的比重也越来越大.各种品牌及尺寸的手机也不尽相同.尺寸不同就算了分辨率,视 ...
- java详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- github上删除一个项目或者reposity
1,点击github的头像,选择如下操作. 2.选择要删除的reposity 3.选择settings 4.复制reposity名字,然后下滑鼠标到底部,选择delete this reposity ...
- Runtime(IV) - 序列化与反序列化
准备条件 父类 Biology Biology.h #import <Foundation/Foundation.h> @interface Biology : NSObject { NS ...
- python 某个目录下的所有文件列表
使用os.listdir() 函数来获取某个目录中的文件列表 import os names = os.listdir('somedir') 结果会返回目录中所有文件列表,包括所有文件,子目录,符号链 ...
- 集合运算—union(并集)、intersect(交集)和except(差集)
一.集合运算的基本格式是: 集合查询1 <集合运算> 集合查询2 [order by ...] 二.集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐 ...
- centos 6.8 配置csh的shell和环境变量
1.查看shell 查看系统中安装的所有版本的shell:cat /etc/shells 查看当前用户使用的shell:echo $SHELL 2.修改用户shell 可以在/etc/passwd ...