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 ...
随机推荐
- 基于Extjs+SpringMVC+MyBatis+Oracle的B/S信息系统简化开发思路
要在上层简化就得有下层强大的架构作为支撑,通过采用企业级的各种框架,虽然学习成本高一些,但用好了效率也自然高. 数据层简化: 首先所有表都有名称为ID的主键字段.有与表同名的序列作为自增key. 数据 ...
- Navicat 连接Oracle11g时出现ORA-12514:TNS:no listener
前两天做系统时用navicat连接Oracle数据库还好好的,今天一连突然就开始报ORA-12514:TNS:no listener.然后看网上大部分教程需要改listener.ora文件中的 将HO ...
- vue路由(一个包含重定向、嵌套路由、懒加载的main.js如下)and 路由跳转传参的query和params的异同
import Vue from 'vue'import VueRouter from 'vue-router'import App from './App'Vue.use(VueRouter)cons ...
- python快速开发Web之Django
以前写测试框架,要么是纯python代码驱动的,要么是WinForm界面的框架,多人操作并不适合. 就想用python写个Web版的,于是想到了Web快速开发的框架Flask和Django两个 个人觉 ...
- Unity 2D入门基础教程之僵尸先生
注:这是根据网上教程完成的. 翻译:http://blog.1vr.cn/?p=1422 原文:http://www.raywenderlich.com/61532/unity-2d-tutorial ...
- Docker日志
搜索Redis镜像 docker search redis ***************************** 拉取Redis镜像 docker pull redis ************ ...
- C# And Java 3DES加解密 ECB模式/PKCS7
c#: /// <summary> /// 完整 /// </summary> public class TripleDESHelper1 { ...
- mysql 5.6 分区与不分区的区别
mysql> CREATE TABLE t1 ( id INT, date DATETIME DEFAULT CURRENT_TIMESTAMP) ENGINE=Innodb; Query OK ...
- 如何删除WINDOWS中服务中不再使用的服务?
右键选择那个不需要的服务,点击属性,看到"服务名",拷贝下来 然后通过管理员的方式进入到控制台,输入 sc delete "你刚才拷贝的服务名" ,就行了,注意 ...
- [ Windows BAT Script ] BAT 脚本获取windows权限
BAT 脚本获取windows权限 @echo off echo I am trying to run as Administrator %1 %2 ver|find "5."&g ...