我正在cpp中编写一个控制台应用程序,它通过TCP将控制命令从文件发送到主机并接收响应。 所有这些信息都显示在屏幕上并记录到文件中,这是实际问题。输出字符串似乎以任何理由存储垃圾,即使我尝试设置固定长度。
编辑:清理代码并处理recv()的返回值。我唯一没有得到的是我的日志文件中的 2nd 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]='\0';
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
答案 0 :(得分:3)
编写TCP接收器时要记住的一个关键点是TCP被视为数据流。这意味着当您从发送N字节数据包的内容执行接收时,您可以收到:
假设没有断开,缓冲区溢出或其他错误,您将始终按照它发送的顺序接收服务器发送的内容,但消息可能会在接收端被截断或连接。这是自定义TCP协议的许多[引用需要?]包括长度字段(因此您知道需要接收多少数据)或某种表示结束的方式的原因之一数据。这样你的接收器就可以循环,直到它收到适当的数量,剩下的就在TCP缓冲区中,以便下次接收。
当你说你看到“垃圾”时,它对我来说看起来不像垃圾,它看起来像几个数据包连接在一起。