假设我有两个缓冲区:
我需要将此发送到服务器。服务器收到缓冲区后立即做出响应。
现在,如果我为此使用两个send
调用(一个用于标头,一个用于有效负载),则在Windows上的延迟会非常糟糕:发送后,recv
(服务器响应)到达的速度非常慢(40-100ms)。如果我为套接字打开TCP_NODELAY,响应会更快,但是我仍然对结果不满意(5-10毫秒。但是服务器会立即响应。到服务器的Ping时间为0.1毫秒-在本地网络上)。 / p>
我读了here,所以我们应该避免写-写-读。但是,这正是我现在正在做的事情。我该怎么解决?
直接的解决方案是将标头和有效负载复制到新缓冲区中,然后发送该缓冲区。但是我想避免这种情况,因为我需要为此分配一个新的更大的缓冲区(更不用说副本了)。
另一种解决方案是分配一个较小的缓冲区(如4KB),然后分块发送数据。但是,通过这种方式,我不确定如何将这4KB块切成TCP / IP段。可能会发生最后一段很小的情况,所以这会导致效率低下。
Linux具有MSG_MORE
,可以在Linux上解决此问题。但是我看不到Windows的等效版本。
最有效(快速)的解决方案是什么?