假设对该Socket依序连续发起两次以上的异步写操作,即发送数据,最终数据是否按顺序发出,客户端是否能按顺序收到数据?
1.书本的理论上异步IO操作不保证完成的顺序性.
2.实际测试运行数据消息是按序收到的,但实践没有100%的理论逻辑保证,程序有逻辑上的崩溃可能.
3.如果不能对TCP Socket进行连续异步写数据,且保证最终是有序的发送,那么Socket的异步完成端口没有实用价值.如果要等上次异步写操作完成,才能发送第2个数据,同步方式的方案最佳.完成端口的优势仅在其流量上.
4.假设用一个for循环连续发起1000次以上的异步写操作,意味着大量的系统资源被耗用,对服务器而言几千次很平常.
研究碰撞反应受阻,只好想些知识极限范围内的问题.
补:
发送顺序肯定和投递顺序一致的,这个是系统保证的,但完成通知的次序是不保证和投递次序一致的。- WINDOWS网络编程(第2版)
// 下段摘自网络论坛
其实在使用IOCP的时候,为每个SOCKET连接建立一个发送队列,发完一个包后才发第2个,这样从单个SOCKET来看,是成了阻塞的,但是从整个系统来看,比如你有1万个连接,那么对于单个连接来说,是不是组塞的问题都不大。因为当连接数多了后,你考虑的问题不是单个SOCKET要有多块,而是系统资源和带宽如何平均地分配给这么多个连接。