实例分析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

将server端的代码中的sleep(60)注释,即服务端listen即开始进入while循环中的accept阻塞:
...
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
结果分析:
由于每个连接在建立之后,已完成队列中的连接马上就被accept给读取了,所以已完成和未完成队列中的连接数之和根本不可能超过backlog限定的个数。

转自:http://blog.csdn.net/ordeder/article/details/21551567

listen()函数中backlog参数分析的更多相关文章

  1. 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 ...

  2. tcp/ip协议listen函数中backlog參数的含义

    listen函数的定义例如以下所看到的: #include <sys/socket.h> int accept(int sockfd, struct sockaddr * restrict ...

  3. TCP/IP协议中backlog参数

    TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...

  4. TCP之三:TCP/IP协议中backlog参数(队列参数)

    目录: <TCP洪水攻击(SYN Flood)的诊断和处理> <TCP/IP协议中backlog参数> TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(ac ...

  5. Python 函数中,参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  6. Main函数中的参数argc,argv的使用简单解析

    本篇文章是对Main函数中的参数argc,argv的使用进行了简单的分析介绍,需要的朋友参考下: C/C++语言中的main函数,经常带有参数argc,argv,如下:  int main(int a ...

  7. vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置

    vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...

  8. unserialize函数中的参数是否是污染数据

    1.原理 在程序编写的时候,往往需要序列化一些运行时数据,所谓序列化就是按照一定的格式将运行时数据写入本地文件.这样做可以对数据进行本地保存,用的时候直接读文件就可以把运行时产生的数据读出.php中就 ...

  9. (转)Java程序利用main函数中args参数实现参数的传递

    Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,J ...

随机推荐

  1. 大数据工具比较:R 语言和 Spark 谁更胜一筹?

    本文有两重目的,一是在性能方面快速对比下R语言和Spark,二是想向大家介绍下Spark的机器学习库 背景介绍 由于R语言本身是单线程的,所以可能从性能方面对比Spark和R并不是很明智的做法.即使这 ...

  2. 监督学习之knn算法

    1.1  KNN(K-Nearest Neighbor)工作原理: 存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类对应的关系.输入没有标签 ...

  3. composer 用法

    构建工程 composer create-project test/name project_name help composer help create-project 参数 --prefer-di ...

  4. 记录一则rebuild index消除索引碎片的效果

    背景:在一次某客户的停产维护中,有一项例行对大表rebuild索引的操作,本是按部就班的操作,其效果却出乎我的意料,大部分索引的效果前后都有4倍左右的变化,最大的那个索引前后居然差了7倍多,并且重建索 ...

  5. 14.ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  6. rsync+inotify磁盘数据实时同步

    一.rsync+inotify主服务器部署 1.1安装rsync [root@nginx ~]# cd /usr/src/ [root@nginx src]# tar zxvf rsync-3.0.9 ...

  7. 大数据-05-Spark之读写HBase数据

    本文主要来自于 http://dblab.xmu.edu.cn/blog/1316-2/ 谢谢原作者 准备工作一:创建一个HBase表 这里依然是以student表为例进行演示.这里假设你已经成功安装 ...

  8. 字符串转Int—parseInt源码实现。

    public static int parseInt(String s, int radix) throws NumberFormatException{ /* * WARNING: This met ...

  9. idea上传项目到github出现"remote with selected name already exists"情况的解决

    1. 2. 3.

  10. OpenCV resources

    http://blog.csdn.net/small_foxrabbit/article/details/39858149http://blog.csdn.net/wuyoy520/article/d ...