0

我正在尝试通过创建线程来实现多线程 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 方法。实际上它不会等待客户端接收任何请求。程序刚刚终止。

谁能告诉我为什么会出现这个问题,我该如何解决?

4

1 回答 1

2

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

要么不分离线程,而是使用pthread_join“加入”线程,或者pthread_exit从主线程使用以确保它将等待所有分离的线程完成。

于 2013-10-25T10:40:17.250 回答