Linux开发 --- 网络篇之listen的backlog

本文深入探讨Linux网络开发中listen函数的backlog参数如何影响连接队列。通过实验分析,展示了当backlog满时,loopback接口与eth接口处理新连接的不同策略:loopback可能会丢弃ACK,而eth接口则直接拒绝SYN包。实验结果揭示了listen队列满后的不确定性,提示开发者注意处理这种情况。
摘要由CSDN通过智能技术生成

摘要

本文主要分析linux网络开发中关于listen函数的backlog参数的设置对于编程的影响。从eth接口和loopback接口看其在连接队列满后对新连接的处理情况。

本文测试环境基于VMWare上的Centos 7。

1,  client端

    client端调用connect函数向server端发送sync包,当服务器收到sync包并回给sync+ack后服务器的状态变为syn_recv状态,

client收到syn+ack后状态就变成了ESTABLISHED状态。此时客户端认为连接建立成功了,connect成功返回。

2,server端

    server端调用listen后,listen socket转为被动状态(即等待连接)。而listen的backlog指定了这个被动状态的socket的未连接队列和已连接队列的长度。本文主要探讨backlog对建立连接的影响。当服务器端收到客户端三步握手协议的最后一个ack时,会把处于sync_recv状态的socket从未连接队列移除放入已连接队列(ESTABLISHED)队列中,此时accept函数返回。

 

3,服务器端测试程序

服务器程序故意在listen后进入死循环,即不从ESTABLISHED队列把完成握手的socket移除,以便于查看。

int main()
{
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(12345);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    int listen_fd = socket(PF_INET, SOCK_STREAM, 0);
    if(listen_fd == -1){
        perror("create socket");
        return -1;
    }
    if(bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))== -1){
        perror("bind");
        return -1;
    }
    if(listen(listen_fd, 5) == -1) {
        perror("listen");
        return -1;
    }
    //while(1)
    //{
    //    sleep(50000);
    //    struct sockaddr_in client_addr;
    //    socklen_t len;
    //    int client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);
    //}
    while(1){
        int a = 0;
        a = a + 1;
    }
    return 0;
}

4,实验结果

4.1,使用loopba

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值