关于网友提出的“ 完成端口数据发送方法?”问题疑问,本网通过在网上对“ 完成端口数据发送方法?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 完成端口数据发送方法?
描述:本帖最后由 VisualEleven 于 2011-06-02 14:28:40 编辑
1.完成端口用WSASend发送数据如果调用成功有可能发的不完全吗?
2.一个线程里面有顺序多次调用WSASend在完成端口的线程里面得到通知的次序会被打乱吗?
3.如果1或2有一个成立的话,我想用普通的非阻塞去发送数据,接收数据还用完成端口这样会有问题吗?效率上有多大的影响?
不想在完成端口的线程里面处理发送结束通知的原因是不想为每一次发送保留缓冲区,请了解这样的细节的和说一下,谢谢啊 。
解决方案1: 不想在完成端口的线程里面处理发送结束通知的原因是不想为每一次发送保留缓冲区
、、、、、、、、、、、、、、、
你可以做个内存池 来 方便管理
解决方案2:
数据要排队发送,在等待的时候肯定是不可更改的,这个前提你没法违反。
发送缓冲区你可以弄一个缓冲区池,超过用量了获取时就得阻塞了(信号量机制简直就是为了这个而设计了)。这样,如果你在完成端口的处理函数中发送,就可能阻塞在这里,就不能及时处理新的接收数据了。但是,既然发送能力已经超载了,那么也可以认为服务器已经超载了吧,无法处理新数据也应该算正常情况了。
解决方案3: 1、异步方式的话,调用成功时多半没有发全的,经常是根本没开始发的
2、应该不会
3、完成端口可以说是异步I/O和线程池的集合,你自己用不使用完成端口的异步I/O和线程池也可以完成同样的功能,效率差不了多少(当然还是差那么一点点的)。
解决方案4: 1.有可能,需要判断然后继续发送(一般8K以下可以发送完全的)
2.对以你send出去的那个数据包本身不会乱,但是几个send之间的数据包可能会乱,这取决于广域网的路由
3.没有问题,效率上可定会有影响。比如你发送时,发送数据的线程就必须要等待发送,浪费了一些时间
以上介绍了“ 完成端口数据发送方法?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2980331.html