【问题标题】:Handling packets received from multiple clients to multiple threads in c处理从多个客户端接收到的数据包到c中的多个线程
【发布时间】:2019-10-13 21:58:15
【问题描述】:

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

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

我在主进程中有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);
    }
}

}

【问题讨论】:

  • 欢迎来到 SO。如果您向我们展示代码,就可以更轻松地提出您需要的建议。
  • @Gerhardh 请帮帮我
  • 数据包是从 main 函数中的 recv from() 接收的,而不是从线程上的 recvfrom() 函数接收的
  • 这些是相当不完整的sn-ps。请提供MCVE 并查看How to ask
  • 在这种情况下通常使用线程来读取来自客户端的连接。使用 UDP,您没有连接,也无法在线程中读取,因为所有客户端数据都在同一个套接字上接收。

标签: c multithreading sockets udp


【解决方案1】:

你不能有多个线程从同一个套接字读取 同一时间。

你应该做的是:

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

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

我从this question上的Remy Lebeau那里得到这个。

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

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多