【问题标题】:(C++) Sending JPG files over sockets(C++) 通过套接字发送 JPG 文件
【发布时间】:2010-11-04 14:58:49
【问题描述】:

我正在学习使用套接字的 C/C++ 编程,并尝试将二进制文件从服务器移动到客户端。这是我在服务器端的内容。

ifstream file(argv[1],ios::binary|ios::ate)
size = new char[file.tellg()]
memblock = new char[size]
file.seekg(0,ios::beg);
file.read(memblock,size);

在将二进制文件的内容读入 memblock 后,我使用套接字函数 read 将其传输。

listen(sockd, 5);
newsock=accept(sockfd, NULL, NULL);
write(newsock, memblock, strlen(memblock));
delete[] memblock; 

同时,在客户端

connect(sockfd, &servaddr, sizeof(servaddr));
read(sockfd, buffer, size);
ofstream output(argv[1], ios::binary);
output.write(buffer, strlen(buffer));
output.close(); 
delete[] buffer 

我了解可能会出现一些错误,例如文件大小可能大于传输的数量,因此文件未完全复制。这只是程序的第一步,因此我将在以后进行必要的修改以分块传输。

现在源代码本身是 1kb(准确地说是 714 字节)。当我在服务器程序中加载它时,它正确报告 strlen(buffer) 为 715。运行客户端时,它也正确报告读取 715 个字节,并且我得到一个与 original_source_code.cpp 相同的漂亮输出文件

但是,我有一个 512 字节的 jpg 文件。服务器程序正确报告 strlen(buffer) 为 512,但是,客户端仅读取 4 个字节并停止。读取的字节数因文件格式不同而异,但它从未真正读取完整的缓冲区。但是,文本文件通过套接字传输而没有任何问题。

发生这种情况的任何原因?我什至无法在同一台机器上执行此操作,例如运行服务器实例并要求客户端实例连接到 127.0.0.1。

任何建议将不胜感激!

【问题讨论】:

    标签: c++ sockets binaryfiles


    【解决方案1】:

    strlen(buffer) 计算字符串的长度。字符串以 0 结尾,您的二进制文件在文件结尾之前可能包含零。

    所以strlen 将返回小于文件大小。

    改用size 变量。

    【讨论】:

    • 糟糕,size 变量实际上是一个常量。这是read 函数ssize_t read(int fd, void *buf, size_t count); 'read() 尝试从文件描述符fd 中读取count 个字节到从buf 开始的缓冲区中的描述。` 成功时,返回读取的字节数`... read() 函数的返回值不等于服务器发送的字节数,也不是-1,所以没有错误(显然)!
    【解决方案2】:

    这里有两个问题:

    1. strlen()\0 结尾(见 @taspeotis 的回答)
    2. 你必须手动循环read();
    int total_read = 0;
    int r = 0;
    while ( ( r = read(sockfd, buffer + total_read , size) ) > 0 )
            total_read += r;
    

    甚至更好:

    connect(sockfd, &servaddr, sizeof(servaddr));
    ofstream output(argv[1], ios::binary);
    
    int byteread;
    while ((byteread = read(sockfd, buffer, buffersize)) > 0 )
        output.write(buffer, byteread);
    output.close(); 
    delete[] buffer 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2011-02-24
      • 2012-01-30
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多