处理从多个客户端收到的数据包到c

时间:2019-05-28 11:21:47

标签: c multithreading sockets udp

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

我正在使用线程为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);
    }
}

}

1 个答案:

答案 0 :(得分:0)

  

在同一插槽中,不能有多个线程从同一套接字读取   同时。

     

您应该选择以下任一方法:

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

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

  4.   

我是从this question Remy Lebeau 那里获得的。

除非您使用不同的端口并自己处理,否则

UDP没有单独连接的概念,这就是为什么它们创建TCP(以及用于更可靠,有序通信的原因)的原因。您已经在使用来模拟可靠的通信。 ACK,因此唯一的开销就是按顺序通信(以及校验和,如果您也不喜欢它们),那么使用TCP可能会更好。