当前位置:  开发笔记 > 运维 > 正文

SO_SNDBUF的影响

如何解决《SO_SNDBUF的影响》经验,为你挑选了1个好方法。

我无法理解以下代码段的工作方式和原因:

    /* Now lets try to set the send buffer size to 5000 bytes */
    size = 5000;
    err = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF,  &size, sizeof(int));
    if (err != 0) {
        printf("Unable to set send buffer size, continuing with default size\n");
    }

如果我们检查发送缓冲区的值,它确实正确设置为5000*2 = 10000.但是,如果我们尝试发送超过发送缓冲区大小,它会发送所有它.例如:

    n = send(sockfd, buf, 30000, 0);

    /* Lets check how much us actually sent */
    printf("No. of bytes sent is %d\n", n);

这打印出30000.

这究竟是如何工作的?发送缓冲区大小限制为10000的事实没有任何影响吗?如果确实如此,究竟发生了什么?某种碎片?

更新:如果套接字处于非阻塞模式会发生什么?我尝试了以下方法:

    将缓冲区大小更改为10000(5000*2)会导致发送16384个字节

    将缓冲区大小更改为20000(10000*2)会导致发送30000个字节

再一次,为什么?



1> Nikolai Feti..:

SO_SNDBUFTCP和UDP 的设置选项的效果不同.

对于UDP,这设置了数据报大小限制,即将丢弃任何更大的数据报.

对于TCP,这只是为给定套接字设置内核缓冲区的大小(有一些舍入到页边界和上限).

因为看起来你在谈论TCP,所以你所观察到的效果可以通过套接字处于阻塞模式来解释,因此send(2)阻塞直到内核可以接受所有数据,和/或网络堆栈异步地将数据排队并推送它到网卡,从而释放缓冲区中的空间.

此外,TCP是一种流协议,它不保留任何"消息"结构.一个send(2)可以对应于recv(2)另一侧的多个s,反之亦然.将其视为字节流.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有