服务器接受许多客户端

时间:2012-10-06 09:33:53

标签: c sockets

如何修改我的服务器以接受多个客户端?

void Serveur()
{//Declaring process variables.
    int server_sockfd, client_sockfd;
    int server_len ; 
    int rc ; 
    unsigned client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    //Remove any old socket and create an unnamed socket for the server.
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htons(INADDR_ANY);
    server_address.sin_port = htons(1111) ; 
    server_len = sizeof(server_address);

    rc = bind(server_sockfd, (struct sockaddr *) &server_address, server_len);
    printf("RC from bind = %d\n", rc ) ; 

    //Create a connection queue and wait for clients
    rc = listen(server_sockfd, 5);
    printf("RC from listen = %d\n", rc ) ; 

    client_len = sizeof(client_address);
    client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);
    printf("after accept()... client_sockfd = %d\n", client_sockfd) ; 
    char ch[BUFFER_TAILLE];
}

2 个答案:

答案 0 :(得分:1)

你有两个解决方案。

答案 1 :(得分:0)

为了能够接受多个客户,您需要做一些事情:

  1. 首先,所有套接字必须是非阻塞的,即当您拨打电话时read / recv在客户端套接字上,它不会阻塞,但如果没有任何内容可以立即返回。
  2. 您需要学会使用selectpoll(或类似)函数来了解哪些套接字已准备好。
  3. 您需要跟踪所有已连接的客户端。最简单的方法是保持一个包含每个客户端信息的结构链表,包括实际的套接字。
  4. 事件循环。你需要继续打电话,例如循环中select,并检查服务器套接字或任何客户端套接字是否“就绪”(即,您可以接收输入)。
  5. 互联网上有很多示例和教程,说明如何执行此操作。

    除了上面概述的方法之外,还有其他方法可以解决这个问题。最常见的是保持套接字阻塞,当新连接到达时,您创建一个新线程或进程来处理客户端连接。此方法最常见于服务器,如客户端连接较短的Web服务器,或者您不希望有多个活动连接。

    您当然可以组合这些方法,例如让进程/线程处理多个连接。