2017-05-16 65 views
0

我下面的教程(靠近該部分的底部大碼塊) 這裏:http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select 和主服務器代碼的代碼是像這樣:爲什麼在使用select()「break」第一個連接時連接到第二個套接字的服務器?

while (true) 
{ 
    read_fds = master; 
    if (select(fd_max + 1, &read_fds, NULL, NULL, NULL) == -1) 
    { 
     cerr << "ERROR. Select failed" << endl; 
     return -1; 
    } 

    for (int i = 0; i <= fd_max; i++) 
    { 
     if (FD_ISSET(i, &read_fds)) 
     { 
      if (i == welcome_socket) 
      { 
       cout << "NEW CONNECTION" << endl; 
       client_len = sizeof(struct sockaddr_in); 
       client_sock = accept(welcome_socket, (struct sockaddr *) &client_addr, &client_len); 
       if (client_sock != -1) 
       { 
        FD_SET(client_sock, &master); 
        if (client_sock > fd_max) 
        { 
         fd_max = client_sock; 
        } 
       } 
      } 
      else 
      { 
       int length, total_read = 0; 

       // CONNECTION CLOSED BY CLIENT 
       if (safe_recv(client_sock, &length, sizeof(int)) <= 0) 
       { 
        cout << "CONNECTION CLOSED" << endl; 
        close(i); 
        FD_CLR(i, &master); 
       } 
       else 
       { 
        char *message = (char *)memset((char *)malloc(length + 1), 0, length); 
        // while ((total_read += safe_recv(client_sock, message + total_read, length - total_read)) < length) {} 
        safe_recv(client_sock, message, length); 

        // RESPOND WITH MESSAGE 
        cout << "MESSAGE: " << message << endl; 

        write(client_sock, process(message), length); 
        free(message); 
       } 
      } 
     } 
    } 
} 

我在做什麼,首先發送(來自客戶端)字符串的長度,然後是字符串本身。然後服務器發回process(message)。 當我只有1個連接時,我看到正確的行爲。但是,如果1已經連接和我連接一個新的客戶,我所看到的是:

  • 第1位客戶不再發送或接收來自服務器任何東西(的結論,因爲沒有什麼是打印到stdout上客戶端)
  • 第2位客戶正在按預期
  • 當第二個連接退出時,服務器會計算爲兩個連接退出(打印CONNECTION CLOSED兩次)

我試圖保持這個非常相似的教程代碼。我已經運行了教程服務器,並且可以按照預期與多個客戶端一起工作。 我是新來的網絡編程,所以我很抱歉,如果這是一個初學者的問題,或者只是我忽略了一些愚蠢的東西。

回答

1

該代碼只從client_sock中讀取和寫入,client_sock被替換爲代碼的接受處理部分中的新套接字。

很可能您想與i互動,而不是client_sock

+0

啊拍!當我從只允許單個客戶轉換到多客戶時,我忽略了這一點。謝謝! – Lightgod131

相關問題