实例分析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. Http post/get

    什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...

  2. react 嵌套组件的通信

    在react中经常会用到的组件嵌套,如下: 图中 parent本身是一个自定义的组件,然后内部又加入了 child的自定义组件,那么这种情况,父子之间如何通信 react中在父组件里面有一个 this ...

  3. selenium + python 测试环境搭建 (WINDOWS)

    1. 下载Python , 运行.exe -> http://python.org/getit/ 2. 下载Python Setuptools 基础包管理工具安装,官方文档参考 https:// ...

  4. 理解tcp顺序释放操作和tcp的半关闭

    Shutdown的调用        在关闭socket的时候,可以有两种方式closesocket和shutdown,这两个函数的区别在什么地方呢? #include <sys/socket. ...

  5. node.js初识05

    小项目,需求,通过url来查询学生学号和老师的编号 05.js var http = require("http"); var server = http.createServer ...

  6. URL List by Category

    URLs List AI https://www.cnblogs.com/zlel/p/8882129.html Javascript Promise http://liubin.org/promis ...

  7. Yii Restful api认证

  8. C# SQLite 数据库操作

    C# SQLite 数据库操作学习 运行环境:Window7 64bit,.NetFramework4.61,C# 7.0 参考: SQLite 官网 SQL As Understood By SQL ...

  9. Sql 嵌套循环

    DECLARE @i INT ,@j INT BEGIN PRINT 'satrt i:'+CAST(@i AS varchar) BEGIN PRINT 'j:'+CAST(@j AS varcha ...

  10. mysql的指令

    mysql有一下几方面的特性: 1:多语言支持 2:可以移植性好 3:免费开源 4:高效(支持多线程,充分利用cpu资源,运行速度非常) 5:支持大量数据查询和储存 6:操作简单易于学习 其实数据库就 ...