send和WSASend区别

来源:互联网 发布:重庆进出口贸易数据 编辑:程序博客网 时间:2024/06/15 21:51

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

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

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

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


===========================================================================================


windows网络编程

要在已建立连接的套接字上发送数据,第一个可用的A P I函数是s e n d,其原型为:

S O C K E T参数是已建立连接的套接字,将在这个套接字上发送数据。第二个参数b u f,则
是字符缓冲区,区内包含即将发送的数据。第三个参数l e n,指定即将发送的缓冲区内的字符
数。最后,f l a g s可为0、M S G _ D O N T R O U T E或M S G _ O O B。另外, f l a g s还可以是对那些标志
进行按位“或运算”的一个结果。M S G _ D O N T R O U T E标志要求传送层不要将它发出的包路
由出去。由基层的传送决定是否实现这一请求(例如,若传送协议不支持该选项,这一请求
就会被忽略)。M S G _ O O B标志预示数据应该被带外发送。
对返回数据而言,s e n d返回发送的字节数;若发生错误,就返回S O C K E T _ E R R O R。常见
的错误是W S A E C O N N A B O RT E D,这一错误一般发生在虚拟回路由于超时或协议有错而中断
的时候。发生这种情况时,应该关闭这个套接字,因为它不能再用了。远程主机上的应用通
过执行强行关闭或意外中断操作重新设置虚拟虚路时,或远程主机重新启动时,发生的则是
W S A E C O N N R E S E T错误。再次提醒大家注意,发生这一错误时,应该关闭这个套接字。最
后一个常见错误是W S A E T I M E O U T,它发生在连接由于网络故障或远程连接系统异常死机而
引起的连接中断时。
send API函数的Winsock 2版本是W S A S e n d,它的定义如下:
这个套接字是一个连接会话的有效句柄。第二个参数是指向一个或多个W S A B U F结构的
指针。它既可是一个独立的结构,又可以是一组结构。第三个参数指明准备投递的W S A B U F
结构数。记住,每个W S A B U F结构本身就是一个字符缓冲和缓冲长度。为何打算同时发送多
个缓冲呢?也许大家不太明白其中的原因。这就是我们稍后要讲的“分散集中I / O模式”;但
是,在一个已建立连接的套接字上利用多缓冲来发送数据时,顺序是从第一个到最后一个
W S A B U F结构。l p N u m b e r O f B y t e s S e n t是指向D W O R D(是W S A S e n d调用返回的)的指针,其中
包含字节总发送数。d w F l a g s参数相当于它在s e n d中的等同物。最后两个参数—l p O v e r l a p p e d
和l p C o m p l e t i o n R O U T I N E—用于重叠I / O。重叠I / O是Wi n s o c k支持的异步I / O模式之一,关
于这一点,我们将在第8章详细讲解。
W S A S e n d函数把l p N u m b e r O f B y t e s S e n t设为写入的字节数。成功的话,该函数就返回0,

否则就返回S O C K _ E R R O R,常见错误和s e n d函数的情形一样。



0 0
原创粉丝点击