C:将文件发送到套接字

spe*_*spe 5 c sockets binary file send

我试图使用socket发送二进制文件.

        FILE *file;
        char *file_data;
        file = fopen(filepath, "rb");

        //Allocate memory
        file_data=(char *)malloc(fileLen+1);

        //Read file contents into buffer
        fread(file_data, fileLen, 1, file);
        fclose(file);

        sent = send(client, file_data, strlen(header)+fileLen, 0);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但有些文件太大了,我想读取一部分缓冲区,发送它,然后读取第二部分,发送它等等.

我试图使用fread和fgets获取零件,但我失败了=(如何正确地做到这一点?

UPD:麻烦在于从客户端读取传入的请求.我没看过.如果我这样做,没有什么不好的事情

Nic*_*xon 8

就像是:

#define CHUNK_SIZE 512

char file_data[CHUNK_SIZE];
//or
char *file_data = malloc(CHUNK_SIZE);

size_t nbytes = 0;
while ( (nbytes = fread(file_data, sizeof(char), CHUNK_SIZE)) > 0)
{
    sent = send(client, file_data, nbytes, 0);
}
Run Code Online (Sandbox Code Playgroud)

但是您还需要以块的形式发送数据,并且不能假设您将在一次调用中发送所有数据.

所以这send()看起来更像是这样的:

    int offset = 0;
    while ((sent = send(client, file_data + offset, nbytes, 0)) > 0) {
            offset += sent;
            nbytes -= sent;
    }
Run Code Online (Sandbox Code Playgroud)

然后你必须准备好在send()调用期间处理中断(在这种情况下你只需要从相同的位置重复发送):

    int offset = 0;
    while ((sent = send(client, file_data + offset, nbytes, 0)) > 0
          || (sent == -1 && errno == EINTR) ) {
            if (sent > 0) {
                offset += sent;
                nbytes -= sent;
            }
    }
Run Code Online (Sandbox Code Playgroud)

在(希望很少见)EINTR的情况下,发送将在下一次循环迭代时重复,并且可能有机会在下次完成并将数据返回到程序

  • 我想你错过了`fread`中的最后一个参数(文件指针)..... (3认同)

spe*_*spe -3

问题在于读取来自客户端的传入请求。我没读过。如果我这样做,不会有什么不好的事情发生