1

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

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];
}
4

2 回答 2

1

你有两个解决方案。

于 2012-10-06T09:42:05.600 回答
0

为了能够接受多个客户,您需要做几件事:

  1. 首先,您的套接字必须是非阻塞的,即当您在客户端套接字上调用 eg read/recv时,它不会阻塞,但如果没有可读取的内容则立即返回。
  2. 您需要学习使用selector poll(或类似的)函数来了解哪些套接字已准备就绪。
  3. 您需要跟踪所有连接的客户端。最简单的方法是保存一个结构的链接列表,其中包含有关每个客户端的信息,包括实际的套接字。
  4. 一个事件循环。例如,您需要在循环中继续调用select,并检查服务器套接字或任何客户端套接字是否“准备就绪”(即有可以接收的输入)。

Internet 上有许多示例和教程展示了如何执行此操作。

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

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

于 2012-10-06T09:41:39.527 回答