gpt4 book ai didi

c sendfile 第二次不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 00:40:10 28 4
gpt4 key购买 nike

这是 LIST ftp 的 cmd 的片段:

count = file_list("./", &files);
if((fp_list = fopen("listfiles.txt", "w")) == NULL){
perror("Impossibile aprire il file per la scrittura LIST");
onexit(newsockd, sockd, 0, 2);
}
for(i=0; i < count; i++){
if(strcmp(files[i], "DIR ..") == 0 || strcmp(files[i], "DIR .") == 0) continue;
else{
fprintf(fp_list, "%s\n", files[i]);
}
}
fclose(fp_list);
if((fpl = open("listfiles.txt", O_RDONLY)) < 0){
perror("open file with open");
onexit(newsockd, sockd, 0, 2);
exit(1);
}
if(fstat(fpl, &fileStat) < 0){
perror("Errore fstat");
onexit(newsockd, sockd, fpl, 3);
}
fsize = fileStat.st_size;
if(send(newsockd, &fsize, sizeof(fsize), 0) < 0){
perror("Errore durante l'invio grande file list");
onexit(newsockd, sockd, fpl, 3);
}
rc_list = sendfile(newsockd, fpl, &offset_list, fileStat.st_size);
if(rc_list == -1){
perror("Invio file list non riuscito");
onexit(newsockd, sockd, fpl, 3);
}
if((uint32_t)rc_list != fsize){
fprintf(stderr, "Error: transfer incomplete: %d di %d bytes inviati\n", rc_list, (int)fileStat.st_size);
onexit(newsockd, sockd, fpl, 3);
}
printf("OK\n");
close(fpl);
if(remove( "listfiles.txt" ) == -1 ){
perror("errore cancellazione file");
onexit(newsockd, sockd, 0, 2);
}

&files 被声明为 char **files 而函数 list_files 是我写的一个与我的无关的函数问题。
我的问题:第一次调用 LIST cmd 时它工作正常,但如果我再次调用 LIST,它总是给我“错误,传输不完整” 我不明白为什么...

最佳答案

sendfile 函数可能不会在一次调用中发送所有数据,在这种情况下,它将返回一个小于 请求的数字。您将此视为错误,但您应该重试。一种方法是使用与此类似的循环:

// Offset into buffer, this is where sendfile starts reading the buffer
off_t offset = 0;

// Loop while there's still some data to send
for (size_t size_to_send = fsize; size_to_send > 0; )
{
ssize_t sent = sendfile(newsockd, fpl, &offset, size_to_send);

if (sent <= 0)
{
// Error or end of file
if (sent != 0)
perror("sendfile"); // Was an error, report it
break;
}

size_to_send -= sent; // Decrease the length to send by the amount actually sent
}

关于c sendfile 第二次不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11860078/

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