c - SO_SNDBUF 小时阻塞 0.04 秒

标签 c linux sockets tcp linux-kernel

我正在尝试使用较小的 SO_SNDBUF 值,主要是为了测试我自己的缓冲代码。

我已将它设置为 1024(尽管当我读回它时它是 4608)。我使用边缘触发的 epoll 在可以写入时得到通知。以下是我的“刷新缓冲区”功能。

    int sent = 0;
send:;
    int n = write(sock, outBuf+sent, outLength-sent);
    if (n == -1) {
        if (likely(errno == EAGAIN || errno == EWOULDBLOCK)) {
            c->writable = false;
            return;
        }
        c->valid = false;
        return;
    }
    sent += n;
    if (n && outLength-sent)
        goto send;
    c->writable = sent == outLength;
    return;

对于更大的缓冲区,这似乎可以正确执行。但是,对于 4608 的 SO_SNDBUF,它会很快阻塞,然后大约 0.04 秒无法写入。

同时系统处于 99% 空闲状态。

这 0.04 秒的延迟从何而来?我对内核进行了 grep,我能找到的只有 TCP_DELACK_MIN 和 TCP_ATO_MIN(均设置为 HZ/25),但我认为它们不是原因?

我的代码正确吗?我是否需要 goto,在 man 7 epoll 上给出答案 9 ?

以防万一,我使用的是 TCP_NODELAY,并且客户端和服务器位于同一台机器上。

最佳答案

它来自缓冲区已满且尚未写入网络并得到对等方确认的事实。

关于c - SO_SNDBUF 小时阻塞 0.04 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412872/

相关文章:

c - 数值积分 : Trapezium Rule in C

c - 使用宏进行类型检查

linux - Postgres : Pipeline to psql

linux - 无法签署 RPM : RPM sign execution returned: '127'

java - 服务器/客户端不通过套接字发送或接收数据[Java]?

python - TCP 上的 Spark 流式传输

c - gcc 退出时未定义对头文件中函数的引用

c中矩阵转置的缓存利用率

linux - 无需远程桌面连接即可运行 GUI

java - Android Studio 套接字问题。无法解析 libcore.util.Objects