【问题标题】:Changing socket options dynamically动态更改套接字选项
【发布时间】:2015-12-05 00:33:24
【问题描述】:

我希望我可以在单个套接字的整个生命周期内快速多次地来回更改 setsockopt 的 optval。

具体来说,我需要根据一些业务逻辑来启用和禁用TCP_NODELAY。有些数据包需要使用TCP_NODELAY 发送出去,而有些数据包是散装的,应该不用它就发送出去。我们提前知道,所以我想设置适当的选项。说来话长——这个问题不是关于启用或禁用 Nagle 的优缺点!

setsockopt 调用生效前是否有延迟?

【问题讨论】:

  • 不应该,但这似乎不是一个好主意。
  • 当然,如果您更改它时有待发送的数据,它也将应用于该数据。不是一个。有用的技术。

标签: linux sockets tcp posix


【解决方案1】:

引用源,它应该立即工作,立即在 tcp_sk 上设置选项:

do_tcp_setsockopt

...
case TCP_NODELAY:
    if (val) {
        /* TCP_NODELAY is weaker than TCP_CORK, so that
         * this option on corked socket is remembered, but
         * it is not activated until cork is cleared.
         *
         * However, when TCP_NODELAY is set we make
         * an explicit push, which overrides even TCP_CORK
         * for currently queued segments.
         */
        tp->nonagle |= TCP_NAGLE_OFF|TCP_NAGLE_PUSH;
        tcp_push_pending_frames(sk);
    } else {
        tp->nonagle &= ~TCP_NAGLE_OFF;
    }
    break;

__tcp_push_pending_frames

tcp_write_xmit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多