当多个客户端将数据包发送到服务器时,我该如何编写代码以在其相应的子线程上接收它们,而不是在主进程上接收它们
我正在使用线程为udp客户端和服务器编写c程序,因此如果我连接了4个客户端,将创建4个线程,每个线程将发送一些数据。收到数据后,客户端将发送ack,但问题是那些ack应该由相应的线程接收,但是
我在主进程中具有receivefrom函数以侦听新的客户端,并且我在线程上也具有Receivefrom函数以获取ack数据包,但是这些来自客户端的ack将进入主进程而不是线程,请提前帮助我< / p>
我的代码 服务器代码
//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);
}
}
}
答案 0 :(得分:0)
在同一插槽中,不能有多个线程从同一套接字读取 同时。
您应该选择以下任一方法:
具有专用线程,该线程接收所有入站数据包,查看源IP /端口,并将数据路由到适当的处理 线程根据需要。
为每个处理线程提供其自己的套接字,该套接字
bind()
与同一个本地IP /端口并connect()
与特定的源 感兴趣的IP /端口,那么每个线程都可以调用recvfrom()
独立地,它将仅返回与源匹配的数据包 该线程所期望的。
我是从this question的 Remy Lebeau 那里获得的。
除非您使用不同的端口并自己处理,否则UDP没有单独连接的概念,这就是为什么它们创建TCP(以及用于更可靠,有序通信的原因)的原因。您已经在使用来模拟可靠的通信。 ACK,因此唯一的开销就是按顺序通信(以及校验和,如果您也不喜欢它们),那么使用TCP可能会更好。