C: 将文件发送到套接字



我正在尝试使用套接字发送二进制文件。

        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);

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

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

UPD:读取来自客户端的传入请求时出现问题。我没有读过。如果我读了,没有什么不好的事情发生。

类似于:

#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);
}

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

因此send()必须看起来更像这样:

    int offset = 0;
    while ((sent = send(client, file_data + offset, nbytes, 0)) > 0) {
            offset += sent;
            nbytes -= sent;
    }

然后,您必须准备好在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;
            }
    }

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

Fread((块

// assumes TCP
#define MTU_SIZE 1500
unsigned char mtu[MTU_SIZE];
int bytes_read;
// if you need a header specifing file size send it here
//Read file contents into buffer
while (( bytes_read = fread(mtu, MTU_SIZE, 1, file)) != EOF )
    if ( send(client, mtu, bytes_read, 0) < bytes_read )
        do_error();

如果只发送一个文件,则不需要标头。当你完成发送时,你只需关闭TCP连接,当客户端收到EOF时,他们就会知道这是EOF;-(

你可能也会发现这个SO问题很有启发性:

为什么写一个封闭的TCP套接字比读一个更糟糕?

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

相关内容

  • 没有找到相关文章

最新更新