微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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,0) != 1); } }

而且,它以一种特殊的方式来放置字符; 即在句子的中间。 例如

在OS X上通过ucontext访问EIP和EBP

我如何以编程方式获得另一个应用程序的安装path?

如何在Windows服务中进行HTTP请求?

如何在C#中重新分配Windows快捷键?

在C ++中测量对system()的调用的执行时间

set variable [fp]exit_flag = true

被发送为

ariable [fp]exit_flag = true

要么

set variable [fp]app_flag = true

被发送为

setrable [fp]app_flag = true

Process.WorkingSet64和Process.PeakWorkingSet64之间的区别

绘制在字面上的一切

如何在Linux中使用C检测挂起的进程?

从Windows窗体获取数据到C#程序

可以-std = c99防止我的#包含工作正常吗?

正如在注释中所提到的那样,您绝对需要检查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来弄清楚另一个客户端的不同之处以及为什么。 您可以使用“查看 – >数据包字节”调出数据包的数据,并可以轻松地检查和复制/粘贴十六进制转储。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐