找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5335|回复: 4

windows下搭建UDP服务的问题

[复制链接]
发表于 2013-11-15 09:31:37 | 显示全部楼层 |阅读模式
需求:海量客户端,每个客户端的IO频率不高(假定20s一次)
1.是否需要使用IOCP?有人讲UDP下不必使用IOCP。
我期望知道UDP下,使用IOCP比阻塞读好多少?

2.假定使用IOCP。
TCP下我们一般通过“单个socket上只有一个未决的读/写请求”来保证收发数据不乱序
而UDP共享一个socket,也不需要保证次序,那么是否可以同时投递多个读(WSARecvFrom)?是否可以投递多个写(WSASendTo)?
对于读操作,我期望根据客户的规模而调整投递读的数量
对于写操作,我期望服务端的任意线程都可以随时发起一个WSASendTo
这样是否合理?

3.“同时”指不必等待前一个请求完成,就直接投递下一个。这里包含并发投递的可能。
换句话说,WSARecvFrom是多线程安全的么?WSASendTo是多线程安全的么?
WSASendTo还有两种情况,发送到同一目标,或者发送到不同目标。这两种情形下WSASendTo的多线程安全性是否一致?
 楼主| 发表于 2013-11-15 10:09:35 | 显示全部楼层
我刚接触IOCP不久,感觉IOCP是个好工具,要发挥作用依赖于使用它的方式。
在网上看了很多帖子,感觉有一些关键的、决定你如何选择的东西比较模糊,大家都根据别人的经验做决策。
如果有人能总结出使用IOCP的一两套网络编程模式,并证明为什么这么做更好,那真是windows网络编程的一大幸事。
希望这里的前辈们不吝指教,在下感激不尽!
发表于 2013-11-15 15:43:20 | 显示全部楼层
首先,我必须先明确你几个概念,你对某些概念理解是有问题的,在正确理解概念的情况下,再去解释你的问题,自然就迎刃而解了。
(1)IOCP是什么?
IOCP并不是一个网络间通讯机制,更确切的说它是一个进程间数据交换机制,它和TCP UDP无关,IOCP只是在windows下一种异步IO的方法,和你发送,接收数据,网卡一点关系也没有。
它的效率之所以被很多人提及,是因为它能解决在大并发的网络IO到达的时候,系统有足够的能力吞吐数据。
也就是说,比如你有10000个TCP连接你的服务器(你可以理解成10000个客户端),每个客户端每秒10个数据包,这时候,IOCP负责将网卡上的数据包搬运到你的内存中。或者将你内存的数据搬运给网卡,剩下的它就不管了。
它只做这个。
其实网上说的IOCP是一个网络模型的概念是完全错误的,它只是一个数据交换手段,优势是操作系统帮你做了数据交换的过程,你只要把你的数据交给操作系统就行了。
再深一步讲,IOCP可以用于本地文件,网络文件,甚至蓝牙。对于IOCP,你的网络行为只是IO模型的一种而已。
比如本地大文件的读写,有时候用IOCP也会有很好的效果。
(2)数据包顺序问题
在UDP模式下,UDP是不负责数据是否完整到达的行为的。(具体可以查阅TCP/IP编程卷2关于UDP的章节),所以它只有到达和不到达两种,自然,顺序取决于路由,也就无法保证了。
但是TCP就不一样了,TCP是流模式,决定了它肯定会保证数据的发送顺序。所以,只要你以正确的顺序读写socket流,就没问题了。
(3)关于IOCP的异步理解。
所谓异步,并不是你现在想象的网卡异步,而是对操作系统而言。
也就是说,你可以用多个线程或者进程对一个IOCP对象进行投递。
在windows内核中,会有一个队列,实际上,你所有的发送接收数据都在这个队列里面。
然后由操作系统保证按照队列的先后顺序写入或读取网络IO。
这和TCP以及UDP完全无关。
你可以把这些网络IO想象成为一个黑箱。它只是利用windows内核队列去投递黑箱。
发表于 2013-11-15 17:57:01 | 显示全部楼层
freeeyes 正解
发表于 2013-11-20 16:21:15 | 显示全部楼层
学习了!{:3_57:}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 10:59 , Processed in 0.011463 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表