2014-11-03 86 views
0

所以我將C代碼設置爲客戶端和服務器。我需要做的是能夠檢查每次打印菜單後是否有人嘗試與我建立連接。如果有人嘗試過,請與他們聯繫。如果他們還沒有嘗試過,請再次打印菜單。我目前正在監聽服務器,但是如何設置它,以便我可以檢查我的監聽隊列而不阻止我的代碼。就像一個小檢查,看看有沒有人。TCP在監聽時做其他事情

+5

總之,'select()。' – EJP 2014-11-03 00:45:44

+1

代碼不應該關心有多少人試圖連接。在檢查listen()的返回碼後,下一條指令應該是accept(),它通常是阻塞的。當accept後的執行轉到下一個指令時,accept的返回值是一個用於與客戶端通信的套接字號。在聆聽/接受時做其他事情,在調用listen()之前啓動另一個線程並在新線程中執行其他操作 – user3629249 2014-11-03 00:53:15

回答

0

這可能有所幫助:Trouble with socket connection in C and Linux。我只能建立一個連接而服務器放棄客戶端後,卻遇到了麻煩。正如上面的帖子所說的,你想要接受連接,而不是啓動一個新的線程來處理新的客戶端套接字,或者分叉一個新的處理客戶端的進程。無論哪種方式工作,但似乎有更多的例子在線使用fork方法。如果你可以發佈你的代碼,我可以看看它,看看我能否提供一些幫助。

我忘了在問題得到解答後我沒有更正糾錯碼。自那時以來已更改的唯一代碼是接受功能

int server_accept_connections(server *serv, int (*process_data)(char *buffer, ssize_t length, int client_scoket)) 
{ 
    int result = 0; 
    int length = sizeof((serv)->client_addr); 
    char *buffer = (char *) malloc(sizeof(char) * 250); 

    if (buffer) {  
     while (result == 0) { 
      serv->client_socket = accept(serv->sockfd, (struct sockaddr *)(serv)->client_addr, &length); 

      pid_t pid = fork(); 
      if (pid < 0) 
       result = -1; 

      else if (pid == 0) { /* client code */ 
       close(serv->sockfd); //the client doesn't need to listen 
       ssize_t data_length = recv(serv->client_socket, buffer, sizeof(buffer), 0); 
       result = (* process_data)(buffer, data_length, serv->client_socket); 
       close(serv->client_socket); 
       break; //have the child leave the while loop -- probably not what I want 
      } 
      else { 
       close(serv->client_socket); 
      }  
     } 
    } 
    else 
     result = -1; 

    free(buffer); 
    return result; 
} 

的代碼還是有點粗糙,但希望你能得到如何處理多個連接的想法。