send和WSASend区别
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函数的情形一样。
send和WSASend区别相关推荐
- Android Handler中post方法与send方法的区别及使用
目录 概述 Handler使用sendMessage方法 Handler使用post方法 post方法与send方法的区别 全部代码 效果图 后记 概述 Handler机制是Android中线程通信的 ...
- 9.什么是send或者WSASend?
各位亲爱的朋友: 我们又在VIP辅助基础课程相会了,那么,这节课,我将与你分享什么是send或者WSASend?TCP协议使用的send.recv.WSASend和WSARecv, UDP协议使用的s ...
- android sendmessage和post的区别,handler中post和send方式区别
handler中post和send方式的区别 1.从用法上 send:发送的是Message post:发送的是Runnable对象 具体用法,如下代码演示: MainActivity.java pu ...
- CAsyncSocket及CSocket的区别和用法
微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易.CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法.这个类基 ...
- 002 通过send断点分析功能call
文章目录 游戏发包流程 分析吃药call 分析换装备call 总结 游戏发包流程 对于网络游戏来说,发送数据包是必不可少的一个环节,无论是走路还是喊话或者是其他功能都需要通过发包函数向服务器发送数据包 ...
- python send 案例_python之pexpect实现自动交互的例子
Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. Pexpect 的使用范围 ...
- send函数和recv函数
目录索引 send函数和recv函数 write()/read() 与 send()/recv() 的区别 函数原型 MSG_OOB(带外数据/紧急数据) MSG_PEEK(数据窥探) MSG_DON ...
- 生成器的send方法
send 和next区别 next:唤醒并继续执行 send:唤醒并继续执行 发送信息到生成器内部. def fib(max):n,a,b = 0,0,1while n < max:msg = ...
- 数组和广义表 - [数据结构]
2005-09-07 数组和广义表 - [数据结构] 第五章 数组和广义表 --非线性数据结构 5.1 数组的定义和运算 ☆二维数组的逻辑结构形式定义为: 2_Array=( D, R ) 其中 D= ...
最新文章
- Go 学习笔记(34)— Go 方法声明、方法调用、方法值、方法表达式、切片对象方法、指针对象方法
- 郁闷。用户的无聊话题
- KVM虚拟机安装与使用
- UITableView reloadData 跳动闪动
- mysql 数据表创建字段类型_MySQL 数据类型简介 创建数据表及其字段约束
- <script>放在head内和body内有什么区别
- spring5.0.2中文官网文档pdf
- LeetCode 19删除链表的倒数第N个节点-中等
- [2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)
- Android-构建不同环境的Apk
- printf输出字符串_c语言入门 第十二章 字符串
- ceph的读写性能测试
- vscode使用:tab键插入空格而不是tab
- 全角半角字符转换函数[SJIS_SBC_TO_DBC][SJIS_DBC_TO_SBC]
- Matlab计算轮廓内切圆
- Windows安全中心功能介绍
- writing idiomatic python翻译
- DirectX11--使用DirectX Tool Kit帮助开发
- 寻仙手游服务器无响应,寻仙手游进不去解决方法 寻仙手游怎么玩不了
- Redis 性能优化 13 条军规
热门文章
- 进程、线程和上下文切换
- SQL Server 2008企业试用版到期,升级为企业版
- SharePoint 自定义WebPart之间的连接
- 好久没有冒泡了,今天花点时间总结下最近做的。
- CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六)
- hibernate连接池配置
- go 连接 kafka 写 mysql
- Java Comparator排序
- python实战===图片转换为字符的源码(转)
- vue2 + vue-router + vuex + iview 入门项目