C ++通过套接字发送包含\ 0的文件,而不会意外关闭

时间:2019-07-13 07:33:00

标签: c++ file sockets

我通过下面的代码序列化文件,然后通过winsocks发送它,这对于文本文件可以正常工作,但是当我尝试发送jpg时,字符串包含\ 0作为某些字符元素,因此套接字仅发送字符串的一部分,认为\ 0是结尾,我正在考虑用其他方式替换\ 0,但是说我用'xx'替换了它,然后又将其替换到另一端,如果文件自然出现了' xx'迷路了吗?当然,我可以制作一个大的,不太可能的序列,但这会使文件膨胀。

任何帮助表示赞赏。

char* read_file(string path, int& len)
{
    std::ifstream infile(path);

    infile.seekg(0, infile.end);
    size_t length = infile.tellg();
    infile.seekg(0, infile.beg);
    len = length;
    char* buffer = new char[len]();

    infile.read(buffer, length);
    return buffer;
}

string load_to_buffer(string file)
{
    char* img;
    int ln;
    img = read_file(file, ln);
    string s = "";
    for (int i = 1; i <= ln; i++){
        char c = *(img + i);
        s += c;
    }
    return s;
}

1 个答案:

答案 0 :(得分:5)

可能在代码中的某个位置(在您发布的代码中没有看到),您使用strlen()std::string::length()发送数据,和/或使用std::string::c_str()来发送数据获取缓冲区。由于这些函数在\ 0处停止,因此会导致数据被截断。

std :: string不适合处理二进制数据。请改用std::vector<char>,然后删除新的[]内容。