一、监听队列链接上限测试
1、res = listen(sockfd,5);
//创建监听队列
res = listen(sockfd,5);
不懂版本有不同的限制,2.6早期版本有限制为128,超过默认为128,可使用uname -a 查看版本
2、测试将链接数到达上限,
方法:限制其accept,只让其去链接,观察最后链接了多少个。
运行结果:
发现有6个链接,有一个未完成三次握手,只发送了链接信息,但服务器端没有回复信息,导致客户端阻塞,延迟多发,多次尝试,当connect超时后,会自动退出。
3、res = listen(sockfd,3000); for( int i = 0; i < 4000; i++)
运行结果:
发现只能链接1021个,相比较于1024,少了3个?
0 1 2 --》标准输入、标准输出、标准错误输出
4、使用netstat -natp 命令,观察系统默认大小
5、利用 ulimit -n 命令调整
ulimit 用来限制每个用户可使用的资源,如CPU、内存、句柄等。
用法:ulimit [-SHacdefilmnpqrstuvx] [限制]
S:表示软限制,超出设定的值会告警。
H :表示硬限制,超出设定的值会报错。
a :列出系统所有资源限制的值
c:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文 件就被称为核心文件(core file)。此为限制每个核心文件的最大容量
d:每个进程数据段的最大值
f:当前shell可创建的最大文件容量
l:可以锁定的物理内存的最大值
m:可以使用的常驻内存的最大值
n:每个进程可以同时打开的最大文件句柄数
p:管道的最大值
s:堆栈的最大值
t:每个进程可以使用CPU的最大时间
u:每个用户运行的最大进程并发数
v:当前shell可使用的最大虚拟内存
ulimit -a
ulimit -n //只显示能打开的文件最大值
ulimit -n 4096 //将文件链接大小改为4096
这里只是进行连接,并不进行数据传输,当前系统可以实现。
6、测试代码
test_cli.c 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
//指定服务器的ip和端口
struct sockaddr_in saddr;//定义一个套接字的地址,代表服务器的地址
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);//6000代表服务器的端口,系统随机分配自身的端口 1024以内属于知名端口,例如短号110等,只有管理员用户可使用 4096以内为保留端口 一般使用都锁使用4096以上
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//循环创建套接字区connect链接
for( int i = 0; i < 100; i++)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if( sockfd == -1)//创建套接字失败
{
printf("creat socket failed\n");
break;
}
int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if( res == -1)
{
break;
}
printf(" i = %d\n",i);
}
}
test_ser.c 服务器端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int socket_init();
int main()
{
int sockfd = socket_init();
if( sockfd == -1)
{
exit(0);
}
//实现死循环,让程序一直运行
while( 1 )
{
sleep(1);
}
}
int socket_init()
{
//创建一个在传输层使用tcp协议的一个套接字
int sockfd = socket(AF_INET,SOCK_STREAM,0); //AF_INET --地址zhu,目前的固定的、服务类型 ---- tcp流式服务
if(sockfd == -1)//创建失败
{
return -1;
}
//定义一个套接字地址,一个ipv4 专用的地址
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);//网络字节 大端
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//将字符串转成无符号整形
//指定ip端口
int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if( res == -1)
{
printf("bind err\n");
return -1;
}
//创建监听队列
res = listen(sockfd,5);
if( res == -1)
{
return -1;
}
return sockfd;
}
命令 uname -a 查看版本
命令 ulimit -a 显示系统中的一些限制
每次创建套接字,即一个文件描述符,一个进程最多能打开多少文件描述符?文件表的大小
可以看出,该程序只能打开1024个文件,只能得到1024个文件描述符。系统对其进行限制,可以进行更改