当前位置: 首页 > 知识库问答 >
问题:

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

耿俊彦
2023-03-14

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

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

}

共有1个答案

乐正德华
2023-03-14

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

您应该做的是:

>

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

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

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

 类似资料:
  • 使用套接字列表编辑: 按照EJP的建议,这样做我的问题就解决了。

  • 最大消息长度为64K字节(尽管我可以将其减少到256字节)。 注意:这将运行在一个微小的嵌入式设备上,所以使用像ZMQ这样的消息传递层不是一个选项(没有足够的内存)。 我可以:

  • 本文向大家介绍C#多线程处理多个队列数据的方法,包括了C#多线程处理多个队列数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我有一个Android应用程序,需要允许多个套接字通信。以下是相关的基本工作: 我的应用程序(说服务器)是一个将作为服务器套接字运行的服务。其他应用程序可以在预定义的端口上连接到它。可以有多个连接,例如客户端1、客户端2。 所以,当客户端1发送hello时,服务器将对此进行处理,并应将回复发送回客户端1。 目前我能够连接客户端1和客户端2的服务器。我已经为其创建了输入、输出缓冲区。但我不确定服务器

  • 我需要从单个客户端/管理器进程向多个snmp代理发送get请求/接收响应。我已经基于以下URL实现了客户端/代理:http://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/http://www.jitendrazaa.com/blog/java/snmp/creating-snmp-agent

  • 问题内容: 好吧,我正在尝试使用SocketServer构建一个小型python prgram,该服务器应该将其接收的消息发送给所有连接的客户端。我被困住了,我不知道如何在服务器端存储客户端,也不知道如何发送到多个客户端。哦,我的程序每次连接1个以上的客户端时失败,并且每次客户端发送的1条以上消息都失败… 到目前为止,这是我的代码: 显然,我不知道自己在做什么,所以任何帮助都将非常有用。 提前致谢