对同一个连接连续调用多次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表示缓冲区不足. 线程是个好东西,但越少越好.IOCP已经开了CPU*2个线程. 理论很完美,实现却要面对丑陋的现实.以上结论仅供参考. (佚名) |