监听socket(bind()的backlog参数)

来源:互联网 发布:linux解压zip命令详解 编辑:程序博客网 时间:2024/06/11 02:07

监听socket的创建:

#include <sys/socket.h>int listen(int sockfd, int backlog);

sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度(backlog + 1)。
listen成功返回0, 失败返回-1,设置errrno。


研究backlog参数对listen系统调用实际影响:

/***********************/ // @file    backlog.c // @author  lesliefish(yuleics@outlook.com) // @date    2016-03-28 17:02:36 /***********************/#include <iostream>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <assert.h>#include <signal.h>#include <string.h>static bool stop = false;//SIGTERM信号处理函数,触发时执行此函数结束循环static void handle_term(int sig){    stop = true;}int main(int argc, char *argv[]){    signal(SIGTERM, handle_term);    if (argc <= 3)    {        printf("%s ip地址端口号 backlog\n", basename(argv[0]));//basename获取路径最后一个'/'后面的内容        return 1;    }    const char* ip = argv[1];    int port = atoi(argv[2]);    int backlog = atoi(argv[3]);    int sock = socket(PF_INET, SOCK_STREAM, 0);    assert(sock >= 0);    //创建IPv4 socket地址    struct sockaddr_in address;    bzero(&address, sizeof(address));    address.sin_family = AF_INET;    inet_pton(AF_INET, ip, &address.sin_addr);    address.sin_port = htons(port);    int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));    assert(ret != -1);    ret = listen(sock, backlog);    assert(ret != -1);    while()    {        sleep(1);    }    close(sock);    return 0;}

该程序接收3个参数:IP地址,端口号,backlog的值。

客户端多次执行连接(telnet ip port),
命令netstat -nt \grep port 查看服务器连接状态。
在监听队列中,处于ESTABLISHED状态的连接只有backlog+1个。


《Linux高级服务器编程》

0 0
原创粉丝点击