2012-10-06 120 views
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]; 
} 
+0

你试过了什么? – tomahh

+0

的代码的其余部分,而(1) \t { \t \t \t \t的printf( “服务器等待\ n”); \t \t \t \t rc = read(client_sockfd,ch,3); printf(“来自客户端的字符=%c \ n”,ch [0]); \t \t // printf(“RC from read =%d \ n”,rc); \t \t \t \t if(ch [0] =='X')break; sleep(10); \t \t ch [0] ++; \t \t write(client_sockfd,ch,1); \t} \t printf(“server exiting \ n”); \t \t close(client_sockfd); – user1543915

+0

@Tom:我想更改服务器的代码以接受许多客户端 – user1543915

回答

0

要能够接受你需要几件事情的多个客户端:

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

在因特网上有很多示例和教程,显示如何执行此操作。

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

你当然可以结合使用方法,比如让一个进程/线程处理多个连接。

相关问题