c++ Winsock recv()缓冲区垃圾
C++ Winsock recv() buffer junk
我正在用cpp编写一个控制台应用程序,它通过TCP从文件向主机发送控制命令并接收响应。所有这些信息都显示在屏幕上,并记录到一个文件中,这才是真正的问题。输出字符串似乎出于某种原因存储了垃圾,即使我尝试设置固定长度。
EDIT:清理代码并处理recv()的返回值。我唯一不明白的是,我的日志文件中的第二 recv行充满了垃圾。也许你们中有人能发现问题。
string cmd="";
char *sendstr=(char*)cmd.c_str();
fflush(stdin);
int n = 1, total = 0;
char temp[1024];
string inStr;
if(cmdin.is_open())
{
while(!cmdin.eof())
{
total=0;
cmd=fread();
send(serverPC, sendstr, (int)strlen(sendstr),0);
n=recv(serverPC,&temp[total],sizeof(temp)-total-1,0); // FIX THIS
total+=n;
temp[total]=' ';
inStr=temp;
fwrite(inStr,cmd);
}
cout << "Data successfully sent!n";
}
else{
cerr<<"can't find 'cmd.cfg' file"<<endl;
}
我期望的输出:
<11:40:00> INIT
received: VELO=0.00km/h DOT=FORW
----
这是我得到的:
<10:05:56> INIT
received: VELO=0.00km/h DOT=FORW
----
<10:05:56> VELO=50.00
received: VELO=0.00km/h DOT=FORW VELO=0.00km/h DOT=FORW VELO=0.00km/h
DOT=FORW VELO=0.00km/h DOT=FORW VELO=0.00km/h DOT=FORW VELO=0.00km/h DOT=FORW
VELO=0.00km/h DOT=FORW
----
<10:05:56> VELO=100.00
received: VELO=50.00km/h DOT=FORW
----
<10:05:56> DOT=BACK
received: VELO=50.00km/h DOT=FORW
在编写TCP接收器时要记住的关键点是TCP被视为数据流。这意味着当您执行从发送N字节数据包的东西接收时,您可以接收到:
- N字节数据
- 小于N字节的数据
- 大于N字节的数据
假设没有断开连接、缓冲区溢出或其他错误,您将始终按照服务器发送的顺序接收它发送的内容,但消息可能在接收端被截断或连接。这是需要大量[引文]的原因之一。]的自定义TCP协议包括长度字段(这样您就知道需要接收多少数据),或者以某种方式表示数据的结束。这样你的接收器就可以循环,直到它收到了合适的数量,把剩余的留在TCP缓冲区中,等待下一次接收。
当你说你看到的是"垃圾"时,对我来说它看起来不像垃圾,它看起来像几个数据包连接在一起。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 如何为winsock的send()函数构造constchar*缓冲区
- IStream COM 读取到缓冲区,然后通过 winsock 发送
- c++winsock-recv()返回不正确且奇怪的缓冲区
- Rx缓冲区Winsock套接字编程C++.如何清除RX缓冲区
- winsock,面向消息的网络,以及从recv中类型转换缓冲区
- c++ Winsock recv()缓冲区垃圾
- 如何在Winsock中查找当前使用的UDP接收缓冲区大小