一、监听队列链接上限测试
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个文件描述符。系统对其进行限制,可以进行更改



















