对同一个连接连续调用多次WSASend是安全的,不需要等到前一个WSASend的操作完成,数据将按调用WSASend的调用顺序发送(当然,前提是没有人笨到用多线程对一个同一个连接连续调用多次WSASend).
但对同一个连接连续调用多次WSASend是一种不稳定的方案,因为可能出现WSAENOBUFS错误(实现总是如此丑陋),对于服务器而言,可能出现就是必然爆发. 由于没有机制可以量化多少个WSASend之后才会出现该错误,所以只能等出现了错误,再做错误处理,这样的逻辑很危险.
实践证明,多个WSASend不会提高发送速率,但会提高CPU占用率和WSAENOBUFS出现的几率,因为每个WSASend都要有一个完成处理流程,得不断地查问那么多的WSASend完成了没有,并作出处理.
对一个连接保持同时只有一个WSASend在运作,发送速率不会慢. 因为服务器不是服务于一个socket,而是服务于上千个socket,不要把IOCP下单个socket的得失看得太重.
一个连接保持同时只有一个WSASend是没错的,当然,也不要像我一样笨到每次WSASend只发送十几个字节数据,然后去责怪单次WSASend的低能,要知道WSASend接收的是一个缓冲区数组. 可以但不能浪费,不要走极端.
当SO_SNDBUF不为0, WSASend的数据被拷贝到底层缓冲区(AFD.sys)等待发送,出现WSAENOBUFS表示缓冲区不足.
当SO_SNDBUF为0, WSASend的数据被内核直接锁定,不可交换页面,这种资源是稀缺的,出现WSAENOBUFS表示物理页面数不足.
线程是个好东西,但越少越好.IOCP已经开了CPU*2个线程.
理论很完美,实现却要面对丑陋的现实.以上结论仅供参考.