首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

完成端口中施用 Send和WSASend区别

2013-09-05 
完成端口中使用 Send和WSASend区别我现在正在做一个完成端口的程序,用完成端口来做服务器接收数据,发送数

完成端口中使用 Send和WSASend区别
我现在正在做一个完成端口的程序,用完成端口来做服务器接收数据,发送数据用的不是完成端口,而且用的是send来发送数据,并且是多线程的发,但是这个时候服务器完成端口接收数据的时候会出先很多问题,比如粘包,数据的丢失等等情况。
现在我还没有做使用WSASend做发送数据的程序,我现在想问如果我用WSASend发送数据给服务器和Send发送数据有什么不一样, Send和WSASend?的区别?
[解决办法]
socket本身有一个send函数,这个函数的只能一次发送一个缓冲区,这对于在发送大量数据的时候或者数据包很多的时候就可能导致可能导致系统的低性能,主要原因在于调用太多次的send函数,导致从用户态到核心态的不断切换,而耗费了当前的CPU时钟周期。

那么解决办法就是减少调用send的次数,一种办法就是使用一个大一点的BUFFER,在发送数据的时候将多个数据包的内容COPY到这个BUFFER中,然后一次发送,这样在一定程度上减少了send的调用次数,但需要一定的编码工作。

Windows平台上有一个WSASend函数,可以支持一次发送多个BUFFER的请求,每个被发送的数据被填充到WSABUF结构中,然后传递给WSASend函数同时提供BUF的数量,这样WSASend就能上面的工作而减少send的调用次数,来提高了性能。

实际检验证明,使用WSASend可以提高50%的性能甚至更多


[解决办法]

引用:
socket本身有一个send函数,这个函数的只能一次发送一个缓冲区,这对于在发送大量数据的时候或者数据包很多的时候就可能导致可能导致系统的低性能,主要原因在于调用太多次的send函数,导致从用户态到核心态的不断切换,而耗费了当前的CPU时钟周期。

那么解决办法就是减少调用send的次数,一种办法就是使用一个大一点的BUFFER,在发送数据的时候将多个数据包的内容COPY到这个BUFFER中,然后一次发送,这样在一定程度上减少了send的调用次数,但需要一定的编码工作。

Windows平台上有一个WSASend函数,可以支持一次发送多个BUFFER的请求,每个被发送的数据被填充到WSABUF结构中,然后传递给WSASend函数同时提供BUF的数量,这样WSASend就能上面的工作而减少send的调用次数,来提高了性能。

实际检验证明,使用WSASend可以提高50%的性能甚至更多


支持一次发送多个BUFFER,在底层也是多次调用send罢了,哪有那么多性能提高。缓冲区就那么大,send和WSASend发送次数是差不多的。用WSASend而不用send的理由很简单,因为send会阻塞,只要缓冲区满了就会阻塞,在IOCP的工作线程中阻塞是绝不允许的,会严重影响工作效率。
[解决办法]
客户端用什么方式发送,和服务端的完成端口接收完全没有关系。
[解决办法]
没多大区别的
都差不多了
这是为了让支持winsock2的程序兼容只支持winsock1.1的系统

看看windows网络编程里面有介绍的,或者google 下

[解决办法]
粘包是无法杜绝的,但很容易解决。数据丢失跟send无关,send只会降低IOCP的性能。并且TCP是不会丢包的,数据丢失只可能是你没对数据包进行排序重组,虽然TCP收数据肯定是顺序的,但IOCP会开与cpu相同数目的线程,线程的执行顺序是无法确定的,所以需要在数据包中加序号,收到后手动重组。

热点排行