c++ - 如何加速写入tcp套接字?

标签 c++ sockets tcp

我在网络服务器上工作,它返回微小的 JSON(大约 200 字节)。业务逻辑大约花费 2-3 微秒,但写入套接字大约花费 25 微秒。我对单个缓冲区使用 write,对多个缓冲区使用 writev

我已经通过启用 TCP_NODELAY 禁用了 Nagle 的算法。还有其他加速写作的方法吗?

监听套接字选项:

......
if (listen(sfd, SOMAXCONN) == -1) { ... }

int val = true;
if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) == -1) { ... }
if (setsockopt(sfd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)) == -1) { ... }
if (setsockopt(sfd, IPPROTO_TCP, TCP_QUICKACK, &val, sizeof(val)) == -1) { ... }

auto flags = fcntl(sfd, F_GETFL, 0);
if (flags == -1) { ... }
flags |= O_NONBLOCK;
if (fcntl(sfd, F_SETFL, flags) == -1) { ... }
......

接受套接字选项:

......
int infd = accept(sfd, &in_addr, &in_len);
if (infd == -1) { ... }

auto flags = fcntl(infd, F_GETFL, 0);
if (flags == -1) { ... }
flags |= O_NONBLOCK;
if (fcntl(infd, F_SETFL, flags) == -1) { ... }

int val = true;
if (setsockopt(infd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) == -1) { ... }
......

提前致谢!

最佳答案

Nagle 算法可能会有所帮助,但只有当您的瓶颈是往返传输本身时,它才会有所帮助。假设您的“写入时间”仅基于数据包 TX 时间(例如:从写入套接字到数据离开适配器的时间),禁用此算法不会解决您的解决方案。基于 TCP 连接的固有流性质,可能没有可靠的解决方法……如果时间真的那么关键,请考虑使用 UDP,尤其是因为您的数据包很小。如果 TCP 是必需的,可以考虑使用不同的套接字库。不过老实说,我觉得你的时机并没有那么可怕。

关于c++ - 如何加速写入tcp套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45875350/

相关文章:

tcp - 如何读取 TCP 连接上的所有字节?

sockets - Windows Phone P2P TCP/IP 连接

c# - 当我的一个客户端崩溃时,NetworkStream.Write 挂起我的服务器应用程序

c++ - 字符串错误检查

java - Tomcat 7 频繁抛出 java.net.SocketException : Connection reset

c++ - 我们可以在哪里使用列表初始化?

c++ - 网络爬虫在 read() 中下载网页的 recv 缓冲区应该有多大?

java - 将填充的对象发送到服务器并接收返回的消息

c++ - 关于数组大小计算

c++ - Direct3D11 在哪里分配资源对象?