2013-10-25 63 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以确保它将等待所有分离的线程完成。