Listen () ignore lag value

As I understand it, the backlog determines the size of the connection queue. Any additional requests that are larger than this time will be discarded (is this a right to a right?).

Now I have a very simple server.c program

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

Now I run 8 clients at a time to connect to this server. Surprisingly, the server serves all 8 clients, but instead it should queue only 5 clients, and the remaining three client requests should be denied. Another interesting point - even if I set this lag value to 0, the result is still the same. Then I tried to comment on the listen () call, with all 8 client connections being denied.

- - .

+5
3

backlog - . , , .

listen()

, , .

, (2) Ubuntu:

backlog , sockfd. , ,       ECONNREFUSED , , ,       .

, "" .

+2

:

listen() , sockfd , , accept (2). sockfd - , SOCK_STREAM SOCK_SEQPACKET. backlog , sockfd. , , ECONNREFUSED , , , .

0

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);
}
0
source

All Articles