Как эффективно отправить заголовок + буфер с TCP / IP? - PullRequest
0 голосов
/ 15 ноября 2018

Предположим, у меня есть два буфера:

  • маленький заголовок (10-20 байт)
  • Полезная нагрузка (варьируется от ~ 10 КБ до ~ 10 МБ, но обычно меньше 100 КБ)

Мне нужно отправить это на сервер. Сервер немедленно отвечает, когда он получил буфер.

Теперь, если я использую два send вызова для этого (один для заголовка и один для полезной нагрузки), я получаю очень плохую задержку для окон: после отправки recv (ответ сервера) приходит очень медленно (40-100ms). Если я включаю TCP_NODELAY для сокета, ответ приходит быстрее, но я все еще не удовлетворен результатом (5-10 мс. Но сервер отвечает немедленно. Время проверки связи с сервером составляет 0,1 мс - это в локальной сети).

Я читаю здесь , что мы должны избегать записи-записи-чтения. Но это именно то, что я делаю сейчас. Как мне решить это?

Простое решение состоит в том, чтобы скопировать заголовок и полезную нагрузку в новый буфер и отправить его вместо этого. Но я бы хотел этого избежать, поскольку мне нужно выделить для этого новый больший буфер (не говоря уже о копии).

Другим решением было бы выделить небольшой буфер (например, 4 КБ) и отправлять данные порциями. Но, таким образом, я не уверен, как этот 4-килобайтный кусок будет разрезан на сегменты TCP / IP. Может случиться так, что последний сегмент будет маленьким, поэтому это вызывает небольшую неэффективность.

В Linux MSG_MORE, что может решить эту проблему в Linux. Но я не вижу аналога для Windows.

Какое наиболее эффективное (быстрое) решение этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...