关于socket的send这个API的问题

w_anthony 2007-12-24 03:42:35
非阻塞方式的send的什么情况下返回值会小于传进去的参数,但大于0呢?
我用setsockopt对SO_SNDBUF也就是发送缓冲区作了设置,然后让接收端故意不收,企图让发送端占满所有缓冲区,结果发现只要缓冲区有一个1字节空间剩余,就可以把我1M的数据包吃干净-_-b。
比如设置发送缓冲区为1024*1024字节,然后发两个1024*1024字节的数据包,第二个返回-1,GetLastError是WSAEWOULDBLOCK;
再设置发送缓冲区为1024*1024+1字节,然后发两个1024*1024字节的数据包,结果两个都成功,无论我怎么试,都试不出“小于传进去的参数大于0”的情况。

至于研究这个问题的原因是,我想弄一个异步发送,如果返回-1并且GetLastError是WSAEWOULDBLOCK,那么就是表示缓冲区不够了,当接收端接收数据之后,我这边发送端会收到FD_WRTIE,然后我响应这个消息继续发就好了,但是如果有“小于传进去的参数大于0”的这种情况,我不知道对方接收后,我这边是不是也会有FD_WRITE。

虽然msdn上说有这种情况,不过我就是试不出来,也就更加不能确定这样的异步方式是否可行了。

哪位前辈如果有类似经验,望不吝赐教!!!
...全文
169 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_anthony 2007-12-25
  • 打赏
  • 举报
回复
总之,我只是把自己的测试结果说明了一下。如果各位认为是一个内存页,那么1字节缓冲可以一次性搞定120M的数据包,也不是它可以解释得了的。
就算是1024*1024-1发两个1024*1024-1大小的数据包,后一个还是WSAEWOULDBLOCK,但如果是1024*1024发两个1024*1024-1大小的数据包,结果也还是都成功。

上面这些测试结果都不重要,也不需要找到一种合理的解释,关键是想知道windows下到底有没有可能出现返回值小于传入参数但大于0的情况

研究这个问题是以下测试结果引出的,如果哪位前辈有这个方面的经验,可以回答下面这个问题,那么上面这些全部无视好了。

测试条件:异步socket发送测试,缓冲区设为4096字节,接收端故意不接收,但保持连接socket有效。
几种测试:
1、先发一个8192字节的数据包,结果直接成功,然后允许接收端接收,发送端这边没有收到FD_WRITE,也就没有调用OnSend。
2、先发一个8192字节的数据包,再发一个相同的数据包,后者失败,LastError为WSAEWOULDBLOCK,然后允许接收端接收,发送端这边可以收到FD_WRITE,因此可以响应之,接续发送以实现异步I/O。
测试结论,当且仅当发送缓冲区溢出并且依然企图往里面写入的情况下,再当对方接收后,发送方才会收到FD_WRITE。
测试疑点,如果某次发送,仅仅发送掉了一半的数据,当对方接收后,发送方会不会有FD_WRITE呢???因为我模拟不出这种情况,所以无法下定论。

lhappyrain 2007-12-25
  • 打赏
  • 举报
回复
帮顶
lzg0001 2007-12-24
  • 打赏
  • 举报
回复
Idle_ 的说法应该是对的!

你指定的缓存区大小只是一个参考,操作系统内部会以其为基础计算一个可用缓存的大小值,而这个值页为单位!
阿呆_ 2007-12-24
  • 打赏
  • 举报
回复
你设置分配1024*1024+1并不表示底层分配缓冲区就是1024*1024+1字节, 很有可能是多一个内存页。 另外缓冲区并不只是在底层nonpage pool内存中, 网卡上也有.
w_anthony 2007-12-24
  • 打赏
  • 举报
回复
自己顶起!!!
w_anthony 2007-12-24
  • 打赏
  • 举报
回复
我又试了一下,缓冲区设为1字节,发一个120M的数据包,直接成功,而且返回字节数是完完整整的120M,但发一个150M的数据包,返回-1,而且GetLastError不是WSAEWOULDBLOCK而是WSAENOBUFS,不管怎么说,还是没有出现“小于传进去的参数大于0”的情况。
w_anthony 2007-12-24
  • 打赏
  • 举报
回复
LS,我让接收端没接收,而且你也可以看看1024*1024和1024*1024+1这两种缓冲区设置的区别。
另外,我是两个都在本地测试的。
僵哥 2007-12-24
  • 打赏
  • 举报
回复
那是因为你的网络带宽足够在短时间内发送出去,如果你发送个20兆看(百兆网络带宽,如果是千兆,则再剩8倍).

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧