繁体   English   中英

listen()忽略积压值

[英]listen() ignoring backlog value

据我了解, backlog确定连接队列的大小。 当时大小如此大的额外请求将被取消( 这个声明是正确的吗? )。

现在我有一个非常简单的程序server.c

socket()
bind()
listen(..., 5)
while(1)
{
  accept()
  read()
  write()
  sleep(3)
  close()
}

现在,我开始8个客户同时连接到该服务器。 令人惊讶的是,服务器为所有8个客户端提供服务,但它应该只排队5个客户端,其余3个客户端请求应该被拒绝。 另一个有趣的观点是,即使我将此积压值设为0,结果仍然相同。 然后我尝试评论listen()调用,所有8个客户端连接被拒绝。

有人可以就此提供任何意见。

backlog参数是关于队列大小的提示 所以你不能指望它做你要求的。

listen()

这个答案似乎涵盖了它。

更多信息,来自我的Ubuntu系统上的listen(2)手册页的引用:

backlog参数定义sockfd的挂起连接队列可能增长的最大长度。 如果连接请求在队列已满时到达,则客户端可能会收到带有ECONNREFUSED指示的错误,或者,如果基础协议支持重新传输,则可以忽略该请求,以便稍后在连接时重新尝试成功。

请注意它到处都说“可能”。

我做过男人听我的系统并获得以下描述:

描述

listen()将sockfd引用的套接字标记为被动套接字,即作为套接字使用accept(2)接受传入的连接请求。 sockfd参数是一个文件描述符,它引用SOCK_STREAM或SOCK_SEQPACKET类型的套接字。 backlog参数定义sockfd的挂起连接队列可能增长的最大长度。 如果连接请求在队列已满时到达,则客户端可能会收到带有ECONNREFUSED指示的错误,或者,如果基础协议支持重新传输,则可以忽略该请求,以便稍后在连接时重新尝试成功。

Server.c

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_un server_address;
    struct sockaddr_un client_address;

    unlink(“server_socket”);
    server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

    server_address.sun_family = AF_UNIX;
    strcpy(server_address.sun_path, “server_socket”);
    server_len = sizeof(server_address);
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

    listen(server_sockfd, 5);
    while(1) 
    {
        char ch;
        printf(“server waiting\n”);

        client_len = sizeof(client_address);
        client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);

        read(client_sockfd, &ch, 1);
        ch++;
        write(client_sockfd, &ch, 1);
sleep(3);
        close(client_sockfd);
    }
}

Client.c

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/un.h>
#include <unistd.h>

int main()
{
    int sockfd;
    int len;
    struct sockaddr_un address;
    int result;
    char ch = ‘A’;

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

    address.sun_family = AF_UNIX;
    strcpy(address.sun_path, “server_socket”);
    len = sizeof(address);

    result = connect(sockfd, (struct sockaddr *)&address, len);
    if(result == -1) 
    {
        perror(“oops: client1”);
        exit(1);
    }

    write(sockfd, &ch, 1);
    read(sockfd, &ch, 1);
    printf(“char from server = %c\n”, ch);
    close(sockfd);
    exit(0);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM