VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1655|回复: 1

如何理解阻塞模式下的send函数

[复制链接]
44_avatar_middle
online_vip 发表于 2013-5-14 17:16:08 | 显示全部楼层 |阅读模式
20驿站币
关于send函数是越来越不明白了。我看了一篇文章内容如下:

//------------------------------------------------------------------------------------

在阻塞模式下send操作将会等待所有数据均被拷贝到发送缓冲区后才会返回。

    如果当前发送缓冲总大小为8192,已经拷贝到缓冲的数据为8000,那剩余的大小为192,现在需要发送2000字节数据,那阻塞发送就会等待缓冲区足够把所有2000字节数据拷贝进去,如第一次拷贝进192字节,当缓冲区成功发送出1808字节后,再把应用缓冲区剩余的1808字节拷贝到内核缓冲,而后send操作返回成功发送字节数。

从上面的过程不难看出,阻塞的send操作返回的发送大小,必然是你参数中的发送长度的大小。

//------------------------------------------------------------------------------------

按上面的意思应该是说:无论要send的发送的数据量有多大,都是要把这些数据发部发送完发返回。。打个比方,如果我要发送
10万个字节出去,按上面的意思应该是只有把这10万个数据全部发完后才返回了? 有可能是第一次只发了一小部分,第二次又发
了一部分,假设到第五次时把才把数据全部发完了。。。如果发了五次发完了,那么send就从开始调用时算起,到最后一次(第五次)时才返回。。

这是我从文章中说的理解成这样的。但是我感觉这不对吧。。。

于是又开始查文章,结果另一篇文章的内容如下:
//-------------------------------------------------------------------------------------
send单线程:如果发送数据大于系统缓冲区长度,或者SOCKET断开则返回SOCKET_ERROR,否则函数总是在将指定大小的数据包发送完到系统缓冲区才会返回。send先检查协议是否正在发送系统缓冲区的数据,如果是就等待协议把数据发送完。
//-------------------------------------------------------------------------------------

对这篇文章的我的理解是:假设还是要发送10万个字节的数据,当然肯定不能一次就发完,调用send时如果只发送了4k的数据,那么send还是会返回的,返回的是SOCKET_ERROR,即发送失败,失败的原因就是WSAEWOULDBLOCK,说明系统缓冲区已经满了。。

最后:上面的两个文章里哪个说的正确呢???? 怎么理解才是对的。。。谢谢各位了。。





上一篇:SDK如何在对话框中的组合框内,获取到鼠标双击事件
下一篇:阻塞模式下循环接收数据的问题
51_avatar_middle
online_admins 发表于 2013-8-1 22:17:13 | 显示全部楼层
这个要看你是同步的还是异步的了。。。异步的会马上返回,即使同步的也会返回,但是不是返回错误,所以一般要循环发送,直到将数据发送完成。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-16 17:05

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表