实例分析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. [LeetCode] 系统刷题6_Linked List

    1. Dummy Node 2. Basic skills [LeetCode] 206. Reverse Linked List_Easy tag: Linked List 2. Fast slow ...

  2. [Guitar self-practising] 【吉他练习王-节奏练习】曲目1 基本扫弦节奏练习

    这本书来自吉他练习王-节奏练习, 大家可以自行到网上搜搜电子版看看. 扫弦练习: 将左手轻轻靠着琴弦, mute琴弦.右手拿上拨片, 节拍器60,左脚踏着节拍练习. note: 注意 “轻”(幅度轻, ...

  3. Linux du命令详解

    1.命令:du 2.命令功能:显示每个文件和目录的磁盘使用空间. 3.命令参数 -a或-all #显示目录中个别文件的大小. -b或-bytes #显示目录或文件大小时,以byte为单位. -c或-- ...

  4. Discuz-阅读权限

    设置用户浏览帖子或附件的权限级别,范围 0-255,0 为禁止用户浏览任何帖子或附件. 当用户的阅读权限小于帖子或附件的阅读权限许可(默认时为 1)时, 用户将不能阅读该帖子或下载该附件

  5. 开源IOT平台

    用于IoT应用程序开发的10大开源软件: 1. DeviceHive DeviceHive基于AllJoyn的Data Art设备,同时也是AllSeen的联盟成员.这一款免费开源机器和机器通信(M2 ...

  6. uva 1633 Dyslexic Gollum

    题意: 给出n和k,求出长度为n的不包含长度大于等于k的回文串的01字符串的个数. 思路: 如果一个字符串包含长度为k的回文串,那么它肯定包含长度为k-1的回文串,所以考虑第i位的时候,只要前缀中不包 ...

  7. GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)

    首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能.远程协助功能 ...

  8. .net nancy

    官网 文档 入门教程 参考

  9. 修改 File --> New 菜单内容

    修改 File --> New 菜单内容 window --> Perspective --> Customize Perspective

  10. java.security.NoSuchAlgorithmException: AES KeyGenerator not available

    异常信息 Caused by: Java.lang.IllegalStateException: Unable to acquire AES algorithm. This is required t ...