Предположим, у меня есть два буфера:
- маленький заголовок (10-20 байт)
- Полезная нагрузка (варьируется от ~ 10 КБ до ~ 10 МБ, но обычно меньше 100 КБ)
Мне нужно отправить это на сервер. Сервер немедленно отвечает, когда он получил буфер.
Теперь, если я использую два send
вызова для этого (один для заголовка и один для полезной нагрузки), я получаю очень плохую задержку для окон: после отправки recv
(ответ сервера) приходит очень медленно (40-100ms). Если я включаю TCP_NODELAY для сокета, ответ приходит быстрее, но я все еще не удовлетворен результатом (5-10 мс. Но сервер отвечает немедленно. Время проверки связи с сервером составляет 0,1 мс - это в локальной сети).
Я читаю здесь , что мы должны избегать записи-записи-чтения. Но это именно то, что я делаю сейчас. Как мне решить это?
Простое решение состоит в том, чтобы скопировать заголовок и полезную нагрузку в новый буфер и отправить его вместо этого. Но я бы хотел этого избежать, поскольку мне нужно выделить для этого новый больший буфер (не говоря уже о копии).
Другим решением было бы выделить небольшой буфер (например, 4 КБ) и отправлять данные порциями. Но, таким образом, я не уверен, как этот 4-килобайтный кусок будет разрезан на сегменты TCP / IP. Может случиться так, что последний сегмент будет маленьким, поэтому это вызывает небольшую неэффективность.
В Linux MSG_MORE
, что может решить эту проблему в Linux. Но я не вижу аналога для Windows.
Какое наиболее эффективное (быстрое) решение этой проблемы?