2014-02-17 22 views
0

我已经构建了一个使用C套接字编程的客户端服务器程序,并且可以在运行在VMware上的Ubuntu操作系统上完美运行。我遇到的唯一问题是listen API调用。限制连接到服务器的最大连接数量不能正常工作

虽然我已将连接限制设置为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