C++ Winsock recv() 缓冲区垃圾

标签 c++ string sockets winsock recv

我正在用 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  

最佳答案

编写 TCP 接收器时要记住的一个关键点是 TCP 被视为数据流。这意味着当您从发送 N 字节数据包的东西执行接收时,您可以接收:

  • N字节数据
  • 少于N个字节的数据
  • 超过N个字节的数据

假设没有断开连接、缓冲区溢出或其他错误,您将始终按照服务器发送的顺序接收服务器发送的内容,但消息可能会在接收端被截断或连接。这是很多 [citation needed?] 自定义 TCP 协议(protocol)包含长度字段(因此您知道需要接收多少数据)或某种表示结束的方式的原因之一数据。这样您的接收器就可以循环,直到它收到正确的数量,将其余部分留在 TCP 缓冲区中以供下一次接收。

当你说你看到的是“垃圾”时,我觉得它不像垃圾,它看起来像是几个数据包连接在一起成为一个数据包。

关于C++ Winsock recv() 缓冲区垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15925158/

相关文章:

python 2.7 : 'Ramón' == u'Ramón'

java - java中有效过滤字符串

c - C : authentication gets 530 "Please login with user and pass" with anonymous 中的套接字 FTP

c++ - 使用动态编程加速函数

javascript - 如何在javascript中正确转换html?

c++ - 将 std::vector<int> 保存到文件

c# - 什么是关于 .net/c# 套接字编程的好教程/方法

java - 关闭套接字和 ObjectOutputStream 的正确方法?

c++ - 指向结构的动态指针数组在成员变量赋值时抛出 SIGSEGV

c++ - Curl 和 Macosx 10.12