在TCP Telnet传输中丢失字符

我正在使用Winsock通过Telnet发送命令; 但由于某种原因,当我尝试发送一个string时,偶尔会有几个字符丢失。 我用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; } 

有什么build议么?


更新:

我检查了,即使所有的字符被发送,错误仍然发生。 所以我决定改变Sendfunction,以便发送单个字符并检查是否已经发送:

 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 

Solutions Collecting From Web of "在TCP Telnet传输中丢失字符"

正如在注释中所提到的那样,您绝对需要检查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 (或同等软件)在追踪问题的根源方面非常出色。

Linux上的Wireshark

过滤你想看的数据包(它有很多选项),并检查它们是否包含你认为包含的内容。

另请注意,telnet是一个包含大量RFC的协议。 大多数情况下,您只需发送原始文本即可离开,但并不能保证能正常工作。

你提到windows telnet客户端从你发送不同的字节,从两个客户端捕获一个最小的序列,并比较它们。 使用RFC来弄清楚另一个客户端的不同之处以及为什么。 您可以使用“查看 – >数据包字节”调出数据包的数据,并可以轻松地检查和复制/粘贴十六进制转储。