处理从多个客户端接收到c中的多个线程的数据包



>当多个客户端向服务器发送数据包时,我如何编写代码以在其相应的子线程上接收它们而不是在主进程上接收它们

我正在使用线程为 UDP 客户端和服务器编写 C 程序,因此如果我连接了 4 个客户端,将创建 4 个线程,每个线程将发送一些数据。 收到数据后,客户端将发送 ACK,但问题是这些 ACK 应该由相应的线程接收,但是

我在主进程中有接收来自函数来侦听新客户端,我在线程上也有接收来自函数来获取 ACK 数据包,但这些来自客户端的确认将进入主进程而不是进入线程请提前帮助我谢谢

我的代码 服务器代码

//created udp socket
// binded
while(1)
{
// to receive new connections 
n=recvfrom(sock,buffer,512,0,(struct sockaddr*)&from,&length);  
// if some client sent request i will assign new thread to serve it
pthread_create(&thread_id[str_cnt], NULL, serve,(void*)(&cli[str_cnt])); 
}
function serve(args)
{
while(1)
{   
// sendind data to that client
sendto(sockfd, buf, BUFSIZE, 0, (struct sockaddr *) &clientaddr,clientlen);
//now wating for ack from the client
sendto(sockfd, buf, BUFSIZE, 0, (struct sockaddr *) &clientaddr,clientlen);
}
}
}

您不能让多个线程从同一套接字读取 同时。

相反,您应该做的是:

  1. 有一个专用线程,用于接收所有入站数据包,查看源 IP/端口,并将数据路由到适当的处理 根据需要进行线程处理。

  2. 为每个处理线程提供自己的套接字,该套接字bind()到同一本地 IP/端口,并connect()到特定源 它感兴趣的 IP/端口,然后每个线程都可以调用recvfrom()独立,它只会返回与源匹配的数据包 线程所期望的。

在这个问题上,我从雷米·勒博那里得到了这个。

UDP 没有单独连接的概念,除非您使用不同的端口并自己处理它们,这就是他们创建 TCP 的原因(也是为了更可靠的有序通信)。 您已经在使用 ACK 模拟可靠通信,因此唯一的开销是按顺序通信(以及校验和,如果您也不喜欢它们),因此最好使用 TCP。

最新更新