gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:17:07 25 4
gpt4 key购买 nike

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

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

我在主进程中有 receivefrom 函数来监听新客户端,并且我还在线程上有 receivefrom 函数来获取 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);
}
}

}

最佳答案

You can't have multiple threads reading from the same socket at the same time.

What you should do instead is either:

  1. have a dedicated thread that receives all inbound packets, looks at the source IP/Port, and routes the data to the appropriate processing thread as needed.

  2. give each processing thread its own socket that is bind()'ed to the same local IP/Port and connect()'ed to the particular source IP/Port it is interested in, then each thread can call recvfrom() independently and it will only return packets that match the source that the thread is expecting.

这是我从 Remy Lebeau 处获取的 this question .

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

关于c - 处理从多个客户端接收到的数据包到c中的多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com