【发布时间】:2015-07-09 16:40:31
【问题描述】:
我正在编写一个通过 tcp 连接发送 bash shell 输出的 c 程序。为了使我的程序响应更快,我使用 setsockopt() 来启用 TCP_NODELAY,这会禁用 Nagle 的缓冲算法。这很好用,除了很少有大消息的滞后。如,如果消息超过大约 500 个字节(可能是 512)。前 500 个字节将通过(在小消息中很快),然后将有 1-2 秒的延迟,然后一次全部接收到其余字节。这种情况每收到 10 到 15 次大消息就会发生一次。在服务器端,消息一次一个字节地写入套接字,并且所有字节都可用,所以这种行为对我来说是意料之外的。
我最好的猜测是套接字中某处有一个 512 字节的缓冲区导致阻塞?我做了一些时间测试来查看滞后在哪里,我很确定这是发生滞后的套接字本身。服务端的所有数据都是在没有阻塞的情况下写入的,但是客户端在延迟之后才收到消息的结尾。但是,我使用 getsockopt() 来查找套接字的接收和发送缓冲区,它们远远超过 512 个字节 - 分别为 66000 和 130000。在客户端,我使用 express js 在处理程序(app.on('data', function(){}))中接收数据。但是我读到这个 express 函数不缓冲数据?
有人能猜出为什么会这样吗?谢谢!
【问题讨论】: