使用c在UDP服务器中实现线程

时间:2013-10-25 10:29:53

标签: c multithreading sockets udp

我正在尝试通过创建线程来实现多线程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 个答案:

答案 0 :(得分:2)

问题在于您分离了线程,这意味着您不必等待线程退出。相反,主程序继续工作,直到它到达终点然后退出,而不考虑仍在运行的(分离的)线程。

要么不要分离线程,要使用pthread_join加入"加入"线程,或者使用主线程中的pthread_exit来确保它等待所有分离的线程完成。