gpt4 book ai didi

c++ - TCP Telnet 传输中丢失字符

转载 作者:可可西里 更新时间:2023-11-01 12:04:03 24 4
gpt4 key购买 nike

我正在使用 Winsock 通过 Telnet 发送命令;但出于某种原因,当我尝试发送字符串时,偶尔会丢失一些字符。我使用发送:

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

最佳答案

如评论中所述,您绝对需要检查 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 是一个包含大量 RFCs 的协议(protocol)。 .大多数情况下,您只需发送原始文本即可,但并不能真正保证有效。

您提到 Windows telnet 客户端向您发送不同的字节,从两个客户端捕获一个最小序列并进行比较。使用 RFC 找出其他客户端的不同之处以及原因。您可以使用“查看 -> 数据包字节”来显示数据包的数据,并且可以轻松地检查和复制/粘贴十六进制转储。

关于c++ - TCP Telnet 传输中丢失字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com