Как уже упоминалось в комментариях, вам абсолютно необходимо проверить возвращаемое значение 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 (или эквивалентное программное обеспечение)отлично в поиске источника проблемы.
Отфильтруйте пакеты, на которые вы хотите посмотреть (у этого есть много вариантов), и проверьте, включают ли они то, что, по вашему мнению, они включают.
Также обратите внимание, что telnet - это протокол с многочисленными RFC .В большинстве случаев вы можете просто отправлять необработанный текст, но на самом деле это не гарантирует его работу.
Вы упоминаете, что клиент Windows Telnet отправляет разные байты от вас, захватывает минимальную последовательность от обоих клиентов и сравнивает их.Используйте RFC, чтобы выяснить, что другой клиент делает по-другому и почему.Вы можете использовать «Просмотр -> Пакетные байты», чтобы вызвать данные пакета и легко проверить и скопировать / вставить шестнадцатеричный дамп.