【问题标题】:Dynamically changing receive buffer size for sockets动态更改套接字的接收缓冲区大小
【发布时间】:2013-09-05 18:21:39
【问题描述】:

我有不同长度的字节数组要从 Windows 桌面应用程序发送到另一台 PC 上的服务器上的 Windows 服务。我在 C# 中使用套接字。我想做的是计算要发送的字节数并将该信息发送到服务器。服务器应用程序将调整接收缓冲区大小以适应从客户端发送到该服务器的字节数组。这是一个糟糕的想法还是一个好的想法,随着应用的进展动态地改变接收缓冲区?

谢谢

【问题讨论】:

    标签: c# sockets buffer


    【解决方案1】:

    接收端缓冲区大小的作用是在应用程序读取数据的速度低于网络可以发送的速率时缓冲数据包。如果发送方以突发方式发送数据,它也会有所帮助。因此,将其保持为多个 MTU (10/20) 的倍数就足够了。如果我理解正确,您正在尝试传达您想要发送的整个数据集(字节数组的长度)并使接收端缓冲区大小相同——这当然没有必要,如果您要发送的数据太大!效率低下的原因是操作系统必须为接收缓冲区分配那么多内存。

    【讨论】:

    • 您好,感谢您这么简洁的回复。这说得通。 1个问题...您说'将其保留为多个MTU(10/20)的倍数'...顺便说一句,我意识到我应该知道这意味着什么。 (我什至用谷歌搜索过)。但我没有:) 这与网络适配器或..有关吗?
    • 嗯,MTU是指MAC层可以传输的帧中的最大数据量。对于以太网,它通常是 1500。当然,以太网也在其顶部添加了自己的 18 个字节。发送小于等于MTU的数据意味着以太网可以发送而不需要拆分成多个帧;实际上,IP 层就是这样做的,称为分片。分片是不好的,因为即使一个分片被丢弃,整组分片也需要重新传输。因此,在发送数据包时,MTU 有一个隐含但重要的考虑因素。
    • 看起来,网络适配器确实允许您选择 MTU 大小:pic.dhe.ibm.com/infocenter/aix/v6r1/…
    • 好的,那么获取我用来接收的适配器 mtu 属性并将缓冲区大小设置为那个?
    • 通常情况下,您不必摆弄适配器的 MTU 设置。只要看看 MTU 是什么。实际上,您应该能够使用套接字获取选项 API 获取 SO_RCVBUF。如果您希望能够缓冲更多(可能是由于应用程序很慢),那么只需使用套接字设置选项 API 将其增加一个因子。
    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2020-03-31
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多