还是socket编程问题,UDP多线程接收

时间:2022-12-15 16:38:55
我在用UDP传输数据,一个服务器端、多个客户端,客户端发送数据不定时,长度不固定,有可能同时有多个客户端在像服务器端发送数据,server接收到数据后需要对数据进行处理,这个耗时有点长,可不可以设计成,服务器端接收到udp包后就新建一个线程对接收到的数据进行处理,然后同时又开始接收新的数据?

或者调用recv方法接收端收到数据后,,将包接收后存入一个缓冲区,然后迅速返回继续recv。

这个存入缓冲区怎么实现呢?最好附一下这个缓冲区设计操纵的代码,

10 个解决方案

#1


可以采用多线程

#2


各位 帮忙给点思路吧 ,谢了

#3


服务端设计成多线程,一个接收线程,一个处理线程,采用production&consumer模式建立。这样处理最快

#4


如果数据包过多,也会丢包呀,有没有办法加大udp的缓冲空间?
引用 3 楼 wqw_dream 的回复:
服务端设计成多线程,一个接收线程,一个处理线程,采用production&consumer模式建立。这样处理最快

#5


楼上的有道理

#6


我尝试出每当接收一个数据包后,就创建一个线程,然后将数据传给线程处理,这个线程为独立线程,这样就可以同时处理多数据包,经过测试发现如果数据包过多的时候会系统会死掉,线程消耗资过多,还有就是依旧有丢包现象,这个怎么解决呢,

#7


创建线程池,每个线程都监听server套接字,除了会惊群以外是完全安全的,memcached的UDP就是i这么做的。

#8


哪用那么复杂,单独开个线程 ,windows下用完成端口,linux用下epool

#9


能不能详细说一下 linux下的
引用 8 楼 nice_cxf 的回复:
哪用那么复杂,单独开个线程 ,windows下用完成端口,linux用下epool

#10


引用 8 楼 nice_cxf 的回复:
哪用那么复杂,单独开个线程 ,windows下用完成端口,linux用下epool


一看就外行,UDP无连接,就一个Fd,epoll有用? 很明显是线程池共同select这个fd即可,udp的接口recvfrom,sendto是线程安全的。

#1


可以采用多线程

#2


各位 帮忙给点思路吧 ,谢了

#3


服务端设计成多线程,一个接收线程,一个处理线程,采用production&consumer模式建立。这样处理最快

#4


如果数据包过多,也会丢包呀,有没有办法加大udp的缓冲空间?
引用 3 楼 wqw_dream 的回复:
服务端设计成多线程,一个接收线程,一个处理线程,采用production&consumer模式建立。这样处理最快

#5


楼上的有道理

#6


我尝试出每当接收一个数据包后,就创建一个线程,然后将数据传给线程处理,这个线程为独立线程,这样就可以同时处理多数据包,经过测试发现如果数据包过多的时候会系统会死掉,线程消耗资过多,还有就是依旧有丢包现象,这个怎么解决呢,

#7


创建线程池,每个线程都监听server套接字,除了会惊群以外是完全安全的,memcached的UDP就是i这么做的。

#8


哪用那么复杂,单独开个线程 ,windows下用完成端口,linux用下epool

#9


能不能详细说一下 linux下的
引用 8 楼 nice_cxf 的回复:
哪用那么复杂,单独开个线程 ,windows下用完成端口,linux用下epool

#10


引用 8 楼 nice_cxf 的回复:
哪用那么复杂,单独开个线程 ,windows下用完成端口,linux用下epool


一看就外行,UDP无连接,就一个Fd,epoll有用? 很明显是线程池共同select这个fd即可,udp的接口recvfrom,sendto是线程安全的。