gpt4 book ai didi

c - 套接字上带有 sendfile 的管道 C 损坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:24 25 4
gpt4 key购买 nike

我正在尝试用 C 重新编写 FTP 服务器。

我打开一个到我的客户端 (PASV) 的数据套接字,当它尝试对有效文件执行 RETR 时,我使用 sendfile 从请求的文件发送到数据套接字:

int fd;
struct stat s;

if (cmd->arg && (fd = open(cmd->arg, O_RDWR)) != -1)
{
fstat(fd, &s);
if ((size = sendfile(client->data_soc, fd, NULL, s.st_size))
== -1)
perror("sendfile failed:");
else
printf("datas sended\n");
close(client->data_soc);
}

client是一个包含数据套接字client->data_soc已经打开的结构,cmd是客户端命令,包含要打开的文件名cmd->arg,这是一个 char *

问题是当我这样做时,sendfile 函数以 SIGPIPE 停止。

我真的不明白为什么,我认为我使用它是正确的,而且我找不到特别针对这个问题的任何解决方案。

感谢您的帮助:)

最佳答案

发生这种情况是因为:

1) 客户端在传输中途关闭了连接;和 2) 系统配置为发出信号而不是返回 EPIPE 错误。

因此您需要同时修复客户端和服务器:客户端不得在中间关闭连接,并且服务器必须能够抵抗客户端滥用。

例如,使用 sigprocmask() 来禁用 SIGPIPE。

关于c - 套接字上带有 sendfile 的管道 C 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43964503/

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