Потеря символов в передаче TCP Telnet - PullRequest
1 голос
/ 10 августа 2011

Я использую Winsock для отправки команд через Telnet; но по какой-то причине, когда я пытаюсь отправить строку, несколько символов иногда удаляются. Я использую send:

int SendData(const string & text)
{   
send(hSocket,text.c_str(),static_cast<int>(text.size()),0);
Sleep(100);
send(hSocket,"\r",1,0); 
Sleep(100);
return 0;
}

Есть предложения?


Обновление:

Я проверил, и ошибка по-прежнему возникает, даже если все символы отправлены. Поэтому я решил изменить функцию Send, чтобы она отправляла отдельные символы и проверяла, отправлены ли они:

void SafeSend(const string &text)
{       
   char char_text[1];
   for(size_t i = 0; i <text.size(); ++i) 
   {
      char_text[0] = text[i];
      while(send(hSocket,char_text,1,0) != 1);
   }
}

Кроме того, он выбрасывает персонажей особым образом; то есть в середине предложения. Э.Г.

set variable [fp]exit_flag = true

отправляется как

 ariable [fp]exit_flag = true

Или

set variable [fp]app_flag = true

отправляется как

setrable [fp]app_flag = true

1 Ответ

2 голосов
/ 10 августа 2011

Как уже упоминалось в комментариях, вам абсолютно необходимо проверить возвращаемое значение send, поскольку оно может возвращаться после отправки только части вашего буфера.

Вы почти всегда хотите вызывать send в цикле, подобном следующему (не тестировалось, поскольку у меня нет доступной среды разработки Windows):

 bool SendString(const std::string& text) {
      int remaining = text.length();
      const char* buf = text.data();
      while (remaining > 0) {
           int sent = send(hSocket, buf, remaining, 0);
           if (sent == SOCKET_ERROR) {
                /* Error occurred check WSAGetLastError() */
                return false;
           }
           remaining -= sent;
           buf += sent;
      }
      return true;
 }

Обновление: это не относится к OP, но вызовы recv также должны быть структурированы так же, как указано выше.

Для дальнейшей отладки проблемы Wireshark (или эквивалентное программное обеспечение)отлично в поиске источника проблемы.

Wireshark on Linux

Отфильтруйте пакеты, на которые вы хотите посмотреть (у этого есть много вариантов), и проверьте, включают ли они то, что, по вашему мнению, они включают.

Также обратите внимание, что telnet - это протокол с многочисленными RFC .В большинстве случаев вы можете просто отправлять необработанный текст, но на самом деле это не гарантирует его работу.

Вы упоминаете, что клиент Windows Telnet отправляет разные байты от вас, захватывает минимальную последовательность от обоих клиентов и сравнивает их.Используйте RFC, чтобы выяснить, что другой клиент делает по-другому и почему.Вы можете использовать «Просмотр -> Пакетные байты», чтобы вызвать данные пакета и легко проверить и скопировать / вставить шестнадцатеричный дамп.

...