如何使用TCP / IP有效发送标头+缓冲区?

时间:2018-11-15 13:37:14

标签: windows sockets tcp

假设我有两个缓冲区:

  • 一个小标头(10-20个字节)
  • 有效负载(在〜10KiB-〜10MiB之间变化,但通常小于100KiB)

我需要将此发送到服务器。服务器收到缓冲区后立即做出响应。

现在,如果我为此使用两个send调用(一个用于标头,一个用于有效负载),则在Windows上的延迟会非常糟糕:发送后,recv(服务器响应)到达的速度非常慢(40-100ms)。如果我为套接字打开TCP_NODELAY,响应会更快,但是我仍然对结果不满意(5-10毫秒。但是服务器会立即响应。到服务器的Ping时间为0.1毫秒-在本地网络上)。 / p>

我读了here,所以我们应该避免写-写-读。但是,这正是我现在正在做的事情。我该怎么解决?

直接的解决方案是将标头和有效负载复制到新缓冲区中,然后发送该缓冲区。但是我想避免这种情况,因为我需要为此分配一个新的更大的缓冲区(更不用说副本了)。

另一种解决方案是分配一个较小的缓冲区(如4KB),然后分块发送数据。但是,通过这种方式,我不确定如何将这4KB块切成TCP / IP段。可能会发生最后一段很小的情况,所以这会导致效率低下。

Linux具有MSG_MORE,可以在Linux上解决此问题。但是我看不到Windows的等效版本。

最有效(快速)的解决方案是什么?

0 个答案:

没有答案