我在学校有一项任务是用C语言编写一个FTP程序(用于Linux)。我立即使用了所有基本功能(ls,cd),但我遇到了文件传输部分的麻烦。我使用sendfile通过套接字发送文件,如下所示:
int fd = open(temp, O_RDONLY);
int rc = sendfile (client_fd, fd, &offset, statbuf.st_size);
我似乎无法弄清楚如何在客户端接收此文件。我尝试这样做调试:
while( (i = read(sock, message, MSG_LEN - 1)) > 0 ) {
message[i] = '\0';
printf("%s", message);
}
这在打印文本文件方面做得很好,但是如果我尝试发送二进制文件,例如,它只打印出二进制文件的开头并挂在read()部分(因为没有来自服务器,我想)。
我感谢任何建议!
答案 0 :(得分:2)
您需要在发送文件后关闭套接字的写入端,以便接收方知道已到达文件的末尾:
shutdown(client_fd, SHUT_WR);
(使用shutdown()
代替close()
,以便您可以查看对方是否成功收到了整个文件。
然后您的阅读方将看到文件结束(read()
返回0),此时它应该close()
它的套接字结束。然后服务器将看到文件结束,它也可以关闭它的套接字(并记录成功的传输)。