我正在使用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快捷键?
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 举报,一经查实,本站将立刻删除。