linux - 动态更改套接字选项

标签 linux sockets tcp posix

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

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

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

最佳答案

引用源,它应该立即工作,立即在 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

关于linux - 动态更改套接字选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34099772/

相关文章:

linux - 在 RHEL 5 (2.6.8-18.el5) 上挂载 NTFS(读/写能力)文件系统

c - tcp 服务器未绑定(bind)到特定端口

sockets - Google 会为它收到的每个请求打开多少个套接字?

c - 为 connect() 函数设置超时 C 中的 tcp 套接字编程中断 recv()

linux - 使用 Bourne Shell 脚本创建新目录

php - 如何在我自己的本地 PHP 服务器上造成拒绝服务?

linux - 为什么这段代码在 ARM 中会陷入死循环

java - 创建多用户客户端-服务器应用程序的合适架构是什么?

node.js - OpenShift socket.io : express deprecated app. 配置 : Check app. 获取 ('env' )

linux - TCP 发送队列卡住