2014-02-17 2 views
0

Я создал клиент-серверную программу, использующую программирование сокетов C, и ее запуск отлично работает на моей ОС Ubuntu, которая работает на VMware. Единственная проблема, с которой я столкнулся, - это вызов API-интерфейса listen.Ограничение максимального количества подключений к серверу не работает

Хотя я установил лимит подключения на 2, я могу открыть четыре терминала и одновременно подключиться к серверу.

listen (serverFd, 2); /* Maximum pending connection length */ 

Клиент и сервер работают на одном компьютере.

Это фрагмент кода

#include <signal.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/un.h>  /* for sockaddr_un struct */ 
#define DEFAULT_PROTOCOL 0 
#define BUFFER_SIZE 1024 


/* POSIX renames "Unix domain" as "local IPC." 
    Not all systems define AF_LOCAL and PF_LOCAL (yet). */ 
#ifndef AF_LOCAL 
#define AF_LOCAL AF_UNIX 
#endif 
#ifndef PF_LOCAL 
#define PF_LOCAL PF_UNIX 
#endif 


/****************************************************************/ 
main() 
{ 

    printf("Hello, server is starting...\n"); 

    // initialize data from text file into system 
    readData(); 

    printf("Country data loaded with total of %i countries available.\n", NoOfRecordsRead); 

    if(NoOfRecordsRead == 0) 
    { 
     printf("No valid data to serve, terminating application...\n"); 
     exit (-1); 
    } 

    int serverFd, clientFd, serverLen, clientLen; 
    struct sockaddr_un serverAddress;/* Server address */ 
    struct sockaddr_un clientAddress; /* Client address */ 
    struct sockaddr* serverSockAddrPtr; /* Ptr to server address */ 
    struct sockaddr* clientSockAddrPtr; /* Ptr to client address */ 

    /* Ignore death-of-child signals to prevent zombies */ 
    signal (SIGCHLD, SIG_IGN); 

    serverSockAddrPtr = (struct sockaddr*) &serverAddress; 
    serverLen = sizeof (serverAddress); 

    clientSockAddrPtr = (struct sockaddr*) &clientAddress; 
    clientLen = sizeof (clientAddress); 

    /* Create a socket, bidirectional, default protocol */ 
    serverFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL); 
    serverAddress.sun_family = AF_LOCAL; /* Set domain type */ 
    strcpy (serverAddress.sun_path, "country"); /* Set name */ 
    unlink ("country"); /* Remove file if it already exists */ 
    bind (serverFd, serverSockAddrPtr, serverLen); /* Create file */ 
    listen (serverFd, 2); /* Maximum pending connection length */ 

    printf("Server started.\n"); 

    while (1) /* Loop forever */ 
    { 
     /* Accept a client connection */ 
     clientFd = accept (serverFd, clientSockAddrPtr, &clientLen); 

     if (fork() == 0) /* Create child to send recipe */ 
     { 
       //do something 

     } 

    } 

} 

Почему это происходит

ответ

3

Хотя я поставил предел подключения к 2

Неа. Вы установили прослушивания накопившихся до 2. Прочитайте документацию по команде слушает:

Отставание аргумента определяет максимальную длину, к которой может расти очередь ожидающих соединений для sockfd. Если при завершении очереди приходит запрос , клиент может получить сообщение об ошибке с указанием ECONNREFUSED или, если базовый протокол поддерживает повторную передачу, запрос может быть проигнорирован, так что последующая перезагрузка при соединении будет успешной.

Ваша программа может решить не звонить accept(), если вы хотите ограничить количество одновременных подключений.

+0

+1 И платформа может тихо регулировать значение отставания вниз или чаще всего вверх. – EJP

Смежные вопросы