2012-10-06 121 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服務器或者您不希望有多個活動連接的服務器。

你當然可以結合使用方法,比如讓一個進程/線程處理多個連接。

相關問題