2010-11-19 94 views
1

我使用udp socket編寫服務器。客戶端發送第一條消息進行連接後,我打開新的套接字與此套接字上的此客戶端進行通信(第一個套接字用於偵聽),併爲每個客戶端創建一個線程。但是在線程中,while循環變得無限,因爲儘管任何客戶端都發送數據,但recvfrom每次都會接收數據。我的代碼中有什麼問題?recvfrom無限接收問題

下面的代碼示例:

int main() 
{ 

    ..... 

     // creating socket 
if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
{ 
    perror("Socket cannot be created\n"); 
    return FAILURE; 
} 

    ..... 

     for(; ;) 
{ 

    // TAKE CLIENTS INFORMATION 
    /**************************************/ 
    recvfrom(sock, &client, sizeof(Client), MSG_WAITALL, (struct sockaddr *)&clientAddr, &size); //1 

     ....... 

       if((sock2 = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
    { 
    perror("Socket cannot be created\n"); 
    return FAILURE; 
    } 

       client.sock = sock2; 

       ... 

       pthread_create(thid+num_client-1, NULL, messanger, (void*)(clients + num_client-1)); 


     } // end of for loop 
}// end of main 


// thread function 
void *messanger(void *argClient) 
{ 
    Client client = *(Client*)argClient; 
    ... 

    while(strcmp(message.buffer, "exit") != 0) 
    { 
recvfrom(client.sock, &message, sizeof(Message), MSG_WAITALL, (struct sockaddr *)&clientAddr, &size); 
printf("%s\n", message.buffer); 

    }// this file loops infinetely altough client does not send data. Printf prints onln new line 

} 

回答

1

你在哪裏bind()第二插座(或第一,對於這個問題)?你爲什麼不檢查recvfrom()失敗?

不管怎樣,這不是編寫UDP服務器的方法。您使用一個套接字來接收所有數據包。然後檢查發件人地址,將其與適當的客戶端進行匹配並根據需要進行處理(例如,您可以將其放到每個客戶端線程的工作隊列中,然後使用pthread_cond_signal()將該線程喚醒)。

+0

hmm。我會試試這個。我也不滿意我的解決方案。但在tcp服務器中,從accept返回的fd號碼更容易工作。所以我可以與這個FD號碼上的特定客戶進行通信。 ©試圖以這種方式假裝,但我看到它不是這樣。謝謝你的答案 – cemal 2010-11-19 14:27:22

0

你正在等待。嘗試使用民意調查或選擇。