当多个客户端向服务器发送数据包时,我如何编写代码在其相应的子线程上接收数据包,而不是在主进程上接收数据包
我正在使用线程为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);
}
}
}
不能让多个线程同时从同一个套接字读取数据。
您应该做的是:
>
为每个处理线程提供自己的套接字,该套接字将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
如何处理多个客户端连接到一个服务器?我有这个logserver.java 和一个嵌入式applet,其中包含如下所示的部分代码,例如 现在的问题是,如果我在服务器上运行“Java日志服务器”,它将打开应用程序并等待输入流,如果我打开我的站点,它将开始流日志。但如果我使用其他计算机/网络再打开一个站点,第二个站点不会记录流。似乎是因为第一个仍然绑定到端口5000。 我该怎么处理?socket实际上是