c++ - 通过套接字发送二进制文件。文本文件有效,没有别的吗?

标签 c++ sockets file-io

我可以毫无问题地发送非常大的文本文件。我尝试发送 jpg 等,但它不起作用。文件大小正确。我不知道我错过了什么。我通过在发送到 temp.foo 文件之前写入数据来检查我的读写功能。我检查它,它处理任何事情。

我是这样发送的

for(vector< .... >::iterator it = v.begin(); it!=v.end(); ++it ){
    pair<...> p=*it;
    send(s,p.first,p.second,0);
}

然后其他程序读取它

    for(i = 0; i < size; i+=max){
    b= 0;
    while (b== 0) {
        if ((b = recv(s, buf, max, 0)) == -1) {
            perror("recv");
            exit(1);
        }
}
    stringstream ss;
    ss << buf;
    char * out = (char*)malloc(b); 
    memcpy(out,buff,numbytes);// Perhaps my error is here?
}
// write function call here

最佳答案

关于处理二进制数据的一些一般要点:

  1. 确保以二进制模式打开输入和输出文件,例如 ios::binary标志或 "rb""wb"格式。默认是文本模式,它会破坏二进制文件中的行尾字符。

  2. 二进制文件可以有 NUL 字节 (\0),这意味着您不能使用处理以 NUL 结尾的字符串的字符串处理函数。 C 字符串不是 NUL 安全的。例如,此代码不会正确填充 ss,因为它将 buf 解释为 NUL 终止的字符串:

    stringstream ss;
    ss << buf;
    

此外,在您指出的行中,带有两个 fbuff 是拼写错误吗?在其他行中,您使用 f 引用 buf

memcpy(out,buff,numbytes);// Perhaps my error is here?

关于c++ - 通过套接字发送二进制文件。文本文件有效,没有别的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653936/

相关文章:

c++ - 关于 C++ 中的 exit() 函数

c++ - 了解 Makefile 的依赖关系 (C++)

c++ - 模板化数学函数应该采用值还是 const 引用?

java - 服务器未接收 Java 应用程序写入套接字的字节

java - 从字符数组中删除所有空元素

c - fscanf 匹配一行,但不匹配另一行,相似的行

c++ - 怎么可能使用 qt 的私有(private) api,即(private/qquicktextnode_p.h)?

java - 消息未发送回 Java 中的客户端

c++ - 等待文件存在且不被其他人占用

java - 从文件中读取最后一行