c - 在C中发送图像文件

标签 c sockets send fopen fread

<分区>

我使用这段代码为我的小型 HTTP 服务器发送二进制文件

/* send binary data to client */

void send_binary(int sock_fd, char *file_name)
{

    int buff_size = 10240;
    char buff[buff_size];
    long file_size;
    FILE *pFile;
    size_t result;
    if ( (pFile = fopen(file_name, "rb")) == NULL){
        error("fopen error\n");
    }

    while( (result = fread(buff, 1, buff_size, pFile)) == buff_size){
        send(sock_fd, buff, buff_size, 0);
        buff[0] = '\0';
    }
    if (result > 0){
        if(feof(pFile)){
            send(sock_fd, buff, result, 0);
        }
        else{
            error("read error\n");
        }
    }
    fclose(pFile);

}

它适用于文本,但不适用于 jpeg 文件。接收到的图像文件已损坏。

最佳答案

fread 不能保证在每次读取时都填充缓冲区,因此您应该只发送 fread 给您的字节数。当 fread 没有为您提供完整的缓冲区时,您可能会提早跳出循环。尝试类似的东西:

while (( result = fread( buff, 1, buff_size, p_file )) > 0 ) {
    send( sock_fd, buff, result, 0 );
}

关于c - 在C中发送图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15238044/

相关文章:

C 中的编译错误

c - 是否可以将结构转换为另一个结构?

c - glibc 的套接字实现在哪里?

c# - Socket.Send,服务器收到很多无效的 MPacket

c - Eclipse 编辑器不显示函数错误,不包括枚举值

c - c中的声波锯齿波

javascript - Node.js 无法处理多个 tcp 消息

客户端/服务器 : Integer always received as 1 (C-programming)

C#串口写字节

c - 如何在程序中稍后使用丢弃的值