Как бороться с фрагментацией сообщений в TCP-сокете Perl? - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть сокуминяция между клиентом Perl и сервером C ++.

Код Perl:

  if (!socket(SERVER, AF_INET, SOCK_STREAM, getprotobyname('tcp'))) {
    die "Can't allocate socket\n";
  } elsif (!connect(SERVER,sockaddr_in($PORT, $tcp_addr))) {
    die "Can't connect to server at $tcp_addr port $PORT...\n";
  }

  SERVER -> autoflush(1);

  print SERVER "$line";

Если $line был слишком длинным, он фрагментирован, и на стороне сервера C ++ мне приходится вызывать recv несколько раз (даже не зная фактической ожидаемой длины!).

Как лучше всего с этим бороться?

Я подумал о некоторых способах:

  1. Может быть, есть какой-нибудь модуль Perl, который занимается этим?
  2. Может быть, я могу просто отключить фрагментацию, но не приведет ли это к дальнейшему сбою передачи?
  3. Я могу просто добавить длину сообщения к отправленному сообщению и буду звонить recv, пока не получу сообщение целиком, но разве это не уродливо?
  4. Что-нибудь еще?

Каким будет лучшее решение?

Ответы [ 2 ]

5 голосов
/ 15 сентября 2011

Добавьте длину сообщения в виде 4-байтового заголовка к сообщению.Это не уродливо, но так же, как это делают "профи".TCP / IP является потоковым протоколом.Вам просто повезло, что вы получили свои сообщения в одном вызове recv.Можно получить любое количество байтов, только половину сообщения, полтора сообщения и т. Д., Поскольку tcp / ip передает непрерывный поток байтов без какого-либо представления пакетов на этом уровне.

Хорошостороной этого является то, что вы можете буферизировать свои сообщения в пространстве пользователя и можете читать столько байтов, сколько хотите, в этот буфер, и обрабатывать несколько сообщений из этого буфера вместо повторного вызова recv ()

4 голосов
/ 15 сентября 2011

Лучшее решение - продолжать вызывать 'recv', пока у вас не появится полное сообщение.Если необходимо определить, когда у вас есть все сообщение, добавьте к его длине префикс или поставьте после него терминатор.Я не уверен, почему ты считаешь это уродливым.

...