gpt4 book ai didi

C:发送文件到套接字

转载 作者:太空狗 更新时间:2023-10-29 14:59:46 26 4
gpt4 key购买 nike

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

        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 情况下,发送 将在下一次循环迭代中重复,并且可能有机会在下一次完成并将数据返回给您的程序

关于C:发送文件到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com