2013-10-25 36 views
0

我想通過創建線程來實現多線程UDP服務器。使用c實現UDP服務器中的線程

以下方法用於創建線程。

pthread_create(&threadID, NULL, ThreadMain, threadArgs); 

ThreadMain方法,

void *ThreadMain(void *threadArgs) { 
    pthread_detach(pthread_self()); 
    int sock = ((struct ThreadArgs *) threadArgs)->sock; 
    free(threadArgs); 
    HandleUDPClient(sock); 
    return (NULL); 
} 

在HandleUDPClient的方法是這樣的,

void HandleUDPClient(int sock) { 

    struct sockaddr_storage clntAddr; // Client address 
    // Set Length of client address structure (in-out parameter) 
    socklen_t clntAddrLen = sizeof(clntAddr); 

    // Block until receive message from a client 
    char buffer[MAXSTRINGLENGTH]; // I/O buffer 

    // Size of received message 
    ssize_t numBytesRcvd = recvfrom(sock, buffer, MAXSTRINGLENGTH, 0, (struct sockaddr *) &clntAddr, &clntAddrLen); 
    ... 
    ... 

當我創造插座並運行它從客戶端完全處理請求的HandleUDPClient方法。但是當我嘗試使用線程時,在進入HandleUDPClient方法後,它不處理recvfrom方法。實際上,它不會等待客戶收到任何請求。程序只是終止。

有人可以告訴我爲什麼發生這個問題,我該如何解決它?

+1

http://stackoverflow.com/questions/11624545/how-to-make-main-thread-wait-for-all-child-threads-finish - 這應該有所幫助。 – user1770426

回答

2

問題是你分離你的線程,這意味着你不必等待你的線程退出。相反,主程序繼續其工作,直到它結束然後退出,而不考慮(分離的)線程仍在運行。

要麼不分離線程,並使用pthread_join「加入」線程,或使用主線程中的pthread_exit以確保它將等待所有分離的線程完成。