C ++套接字检索并发送加密数据

时间:2015-07-21 13:27:57

标签: c++ file sockets binary blowfish

我遇到了一个小问题。目前我正在编写一个连接到服务器的小工具,将一些河豚加密数据下载到char Array (char buffer[512])并将该数组保存到文件{{1} }。

然后我重新打开该文件(fstream ios::binary)并将其发回。这次我把它读成(ifstream ios::binary)而不是std::string

现在我的问题是我发回数据后数据已损坏。

最好的方法是什么?使用char[]char[]是否安全?或者这会以某种方式破坏数据? (我想是这样)。

如果您需要一些代码示例,我可以提供它们。

谢谢!

##########################

好的快速更新,为您提供更多详细信息。

我正在为游戏编写一个工具(在OS X上),它分为两个部分:

  1. 从游戏服务器检索加密数据并保存。
  2. 将保存的加密数据发送回本地游戏
  3. 问题:当保存的数据到达本地游戏时,游戏只是吐出数据无法解密=>数据损坏。

    这里是1的代码(它只是用于自我测试目的的poc):

    std::string

    以下是2。的代码:

    mode == 0 => no gameDataChunk there
    mode == 1 => gameDataChunk there, need to write
    mode == 2 => keyFrame there
    */
    std::string socketRead(int socket, int mode, std::string num_chunk, std::string num_key, std::string game_id){
    
    std::string response = "";
    
    char buffer[512];
    
    int bytes;
    
    while((bytes = read(socket, buffer, 511)) > 0){
    
        std::string temp(buffer, bytes);
    
        //std::cout << temp;
    
        response = response + temp;
    
        if(!(temp.find("HTTP/1.1 200")<1800000)){
            if(temp.find("HTTP/1.1")<1800000){
                std::cout << std::endl << std::endl << "GOT NOT A 200 !!!" << std::endl << std::endl;
                std::cout << temp << std::endl << std::endl;
                return "EXIT";
            }
        }
    
        if(mode == 1){
            if(temp.find("\r\n\r\n")<1800000){
                write_gameDataChunk(buffer, 1, temp.find("\r\n\r\n")+4, num_chunk, game_id);
            }
            else{
                write_gameDataChunk(buffer, 0, 0, num_chunk, game_id);
            }
        }
        else if(mode == 2){
            if(temp.find("\r\n\r\n")<1800000){
                write_keyFrame(buffer, 1, temp.find("\r\n\r\n")+4, num_key, game_id);
            }
            else{
                write_keyFrame(buffer, 0,0, num_key, game_id);
            }
        }
    
        bzero(buffer, 512);
    
    }
    
    return response;
    
    }
    
    void write_gameDataChunk(char buffer[], int mode, int index, std::string num, std::string game_id){
    
    std::fstream write;
    
    char local_buffer[512];
    
    if(mode == 0){
        //complete bin data
    
        write.open("/tmp/" + game_id + "/" + num + "/game_dataChunk.bin", std::ios::out | std::ios::binary | std::ios::app);
    
        write << buffer;
    
    }
    else if(mode == 1){
        //partial bin data
    
        std::string command = "mkdir /tmp/" + game_id + "/" + num;
        std::system(command.c_str());
    
        write.open("/tmp/" + game_id + "/" + num + "/game_dataChunk.bin", std::ios::out | std::ios::binary);
    
        strcpy(local_buffer, buffer+index);
    
        write << local_buffer;
    
    }
    
    write.close();
    
    }
    

    这是我自己的所有测试代码而没有完成,所以它有点丑......但我希望你能理解我的意思。我经常不必处理通过套接字发送的二进制数据..

2 个答案:

答案 0 :(得分:1)

std::string并不意味着要处理二进制文件。它旨在处理字符串。

您想要的是std::vector<char>,它并不关心您存储的值。

答案 1 :(得分:0)

二进制数据中的任何'\ 0'将停止构造std :: string。所以std :: string()。size()只计算在第一个'\ 0'之前的字符。使用std :: vector&lt; unsigned char&gt;代替。

顺便问一下,1800000是什么意思?我知道HTTP/1.1 200是你最早收到的角色。(英语不好)