none
关于socket阻塞模式的疑问 RRS feed

  • 问题

  •   请问一下为什么在阻塞模式中调用send函数发送1G的数据,函数会立即返回?socket的发送缓冲区不可能有1G吧。
    2018年12月10日 4:21

全部回复

  • 你好,

    感谢在MSDN论坛发帖提问.

    >>请问一下为什么在阻塞模式中调用send函数发送1G的数据,函数会立即返回?socket的发送缓冲区不可能有1G吧。

    关于Send函数
    1. 如果有低于SO_SNDBUF的挂起数据, 则 send () 将立即返回 (无论你发送的是 5 kb 还是发送 500 mb, 都无所谓)。
    2. 如果有高于或等于SO_SNDBUF的挂起数据, 则在发送足够的数据将挂起数据还原到SO_SNDBUF以下之前, send()将被阻止。
    详情可以参考这个链接:
    https://stackoverflow.com/questions/28785626/what-is-the-size-of-a-socket-send-buffer-in-windows/28848834
    什么是SO_SNDBUF?你可以参考下这个链接:
            https://stackoverflow.com/questions/4257410/what-are-so-sndbuf-and-so-recvbuf

    希望可以帮到你。

    Jack Zhang


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年12月10日 9:58
    版主
  • 你好:

         请问一下有没有什么方法可以查询到缓冲区中有多少数据没有发送?

    2018年12月11日 1:33
  • 你好,

    send函数的详细说明里面有提到, 如果没有错误的话, send函数会返回所发送的字节总数, 小于send函数里面的要求发送的buf的长度, 详情参考链接
    你指的是这两个数的差值吗。

    Best wishes,

    Jack Zhang


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年12月11日 3:36
    版主
  • 你好:

           我的意思是有没有办法知道sokcet缓冲区中还没有发送出去的字节大小。

    2018年12月11日 4:58
  • 你好:

           我测试的情况和上面说的有点不一样,具体测试过程如下:

            首先我将发送端和接收端的发送缓中区和接收缓冲区都设置为1024.

            第一种情况,发送端发送3072个字节,接收端不调用recv进行接收,用wireshark.exe抓包可以看到接收端成功接收了3072个字节,此时再发送2个字节,send函数不会阻塞,这种情况符合上述的说法。

           第f二种情况,发送端发送3073个字节,接收端还是不调用recv进行接收,用wireshark.exe抓包可以看到接收端成功接收了3072个字节,这个时候发送端的缓冲区中应该有一个字节没有发送出去,这时再发送1个字节,这个时候是没有高于或等于SO_SNDBUF的挂起数据的,但是send函数就会阻塞。这个是为什么呢。

    2018年12月12日 1:18
  • 有没有哪位高手可以解答一下吗?
    2018年12月13日 0:55