C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么一个服务器有listen(sockfd,2)调用能够接受3个连接?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试了解int中的BACklog参数(int sockfd,int BACklog);影响如何处理新的连接.

这是我的服务器程序.

/* server.c */
#include <stdio.h>
#include <String.h>
#include <unistd.h>

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

int main()
{
    int sockfd;
    int ret;
    int yes = 1;

    struct addrinfo hints,*ai;

    memset(&hints,sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    if ((ret = getaddrinfo(NULL,"8000",&hints,&ai)) == -1) {
        fprintf(stderr,"getaddrinfo: %s\n",gai_strerror(ret));
        return 1;
    }

    sockfd = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
    if (sockfd == -1) {
        perror("server: socket");
        return 1;
    }

    if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof yes) == -1) {
        perror("server: setsockopt");
        close(sockfd);
        return 1;
    }

    if (bind(sockfd,ai->ai_addr,ai->ai_addrlen) == -1) {
        perror("server: bind");
        close(sockfd);
        return 1;
    }

    freeaddrinfo(ai);

    if (listen(sockfd,2) == -1) {
        perror("server: listen");
        close(sockfd);
        return 1;
    }

    printf("server: listening ...\n");
    printf("server: sleep() to allow multiple clients to connect ...\n");
    sleep(10);

    printf("server: accepTing ...\n");
    while (1) {
        int connfd;
        struct sockaddr_storage client_addr;
        socklen_t client_addrlen = sizeof client_addr;
        char buffer[1024];
        int bytes;

        connfd = accept(sockfd,(struct sockaddr *) &client_addr,&client_addrlen);
        if (connfd == -1) {
            perror("server: accept");
            conTinue;
        }

        if ((bytes = recv(connfd,buffer,sizeof buffer,0)) == -1) {
            perror("server: recv");
            conTinue;
        }

        printf("server: recv: %.*s\n",(int) bytes,buffer);
        close(connfd);
    }

    return 0;
}

这是我的客户端程序.

/* client.c */
#include <stdio.h>
#include <String.h>
#include <unistd.h>

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(int argc,char **argv)
{
    int sockfd;
    int ret;
    struct addrinfo hints,*ai;

    if (argc != 2) {
        fprintf(stderr,"usage: %s MSG\n",argv[0]);
        return 1;
    }

    memset(&hints,sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;

    if ((ret = getaddrinfo(NULL,"client: getaddrinfo: %s\n",ai->ai_protocol);
    if (sockfd == -1) {
        perror("client: socket");
        return 1;
    }

    if (connect(sockfd,ai->ai_addrlen) == -1) {
        perror("client: connect");
        close(sockfd);
        return -1;
    }

    printf("client: connected\n");

    if (send(sockfd,argv[1],strlen(argv[1]),0) == -1) {
        perror("client: send");
        close(sockfd);
        return -1;
    }

    printf("client: send: %s\n",argv[1]);

    freeaddrinfo(ai);
    close(sockfd);

    return 0;
}

我用以下脚本编译并运行这些程序.

# run.sh
gcc -std=c99 -Wall -Wextra -Wpedantic -D_DEFAULT_sourcE server.c -o server
gcc -std=c99 -Wall -Wextra -Wpedantic -D_DEFAULT_sourcE client.c -o client 
./server &
sleep 1
./client Hello1 &
sleep 1
./client Hello2 &
sleep 1
./client Hello3 &
sleep 1
./client Hello4 &
sleep 1
./client Hello5 &
sleep 5
pkill server

当我运行上面的脚本,我得到这个输出.

$sh run.sh 
server: listening ...
server: sleep() to allow multiple clients to connect ...
client: connected
client: send: Hello1
client: connected
client: send: Hello2
client: connected
client: send: Hello3
client: connected
client: send: Hello4
client: connected
client: send: Hello5
server: accepTing ...
server: recv: Hello1
server: recv: Hello2
server: recv: Hello3

输出显示当服务器在listen()和accept()之间休眠时,所有五个客户端都可以成功地将()和send()连接到服务器.但是,服务器只能接受()和recv()三个客户端.

我不明白以下内容.

>服务器程序调用listen()与BACklog参数为2.为什么所有五个客户端成功连接() – 然后?我期望只有2个connect()成功.
>为什么服务器能够从3个客户端而不是2接受()和recv()?

解决方法

BACklog参数只是listen()的一个提示.从POSIX doc

大佬总结

以上是大佬教程为你收集整理的为什么一个服务器有listen(sockfd,2)调用能够接受3个连接?全部内容,希望文章能够帮你解决为什么一个服务器有listen(sockfd,2)调用能够接受3个连接?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。