实现并发服务器,有哪几种基于线程的实现模式

实现并发服务器,有哪几种基于线程的实现模式,第1张

1.多进程并发服务器

是指TCP连接后,每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理

2.多线程并发服务器

多进程服务器是对多进程的服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。据统计,创建线程于创建进程要快10100倍,所以又把线程称为“轻量级”进程。进程与进程不同的是:一个进程内所有线程共享相同的全局内存,全局变量等信息。

是指TCP连接后,每一个客户机的请求并不由服务器直接处理,而是由服务器创

3.多路复用I/O

I/O是为了解决线程/进程阻塞在那个I/O调用中,常用select或者pool

UDP2000个客户端左右 并发

单个数据包最大512字节

Internet 10MB带宽

要求效率(尽可能快,尽可能少丢包),这种情况下用哪种通讯模型比较有优势!

想用IOCP,因为和select模型相比,这个稍微熟悉一点,也在项目中用过,不过是TCP的。

有两个问题,大家懂得的帮忙给指导一下:

是否可以理解为UDP模式下,一次recvfrom 只对应一次sendto。

2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。

------解决方案--------------------------------------------------------

-------------------------------------

等不到,包被截断了。

2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。

--------------------------

其实,我个人认为对udp而言,不用iocp也可以满足。 首先sendto都是立即完成的,无需异步操作。而recvfrom可以只需阻塞一个线程就够了,不需要重叠操作。

------解决方案--------------------------------------------------------

用UDX协议最可靠,效率高,开发简单,非开源。

UDT开源,对于你这种2000客户,够用,开源。

------解决方案--------------------------------------------------------

1.sendto 10k,接受部分要么收到10k,要么全部丢失,不会出现部分收到的情况。

------解决方案--------------------------------------------------------

-------------------------------------

在局域网可以,公网,一般1K也收不到。

2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。

--------------------------完全可以

------解决方案--------------------------------------------------------

1.如果UDP数据在传输过程中被分包,则你需要对数据包进行标识,已确保获取的包完整。一次recvfrom并不对应一次sendto,考虑UDP不可靠传输的因素。

2.不可以,因为sendto和recvfrom都是对同一个资源Socket进行操作。如果在多个线程中对同一个资源进行操作,如果不加锁的情况下,会非常可怕的。而且,如果你加锁了,其实还不如单线程操作。

按照你的需求最好还是采用UDP,不过可以考虑组播。

2.API调用完全没有问题。但是接到的数据可能和发送的数据次序不一样,这本身是UDP乱序特性决定了的。而且你发送方可能是多线程,从API层面来说,这些调用都是可以的,完全没有问题。但是给你接收方处理带来一系列问题。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/251757.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存