Linux25 -- 监听队列链接上限测试、命令uname、ulimit

一、监听队列链接上限测试

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个文件描述符。系统对其进行限制,可以进行更改

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值