通过C中的套接字发送文件

我在学校找到了一个用C语言编写FTP程序的任务(用于Linux)。 我已经完成了所有基本function(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()部分(因为没有任何东西来自服务器,我认为)。

我很感激任何建议!

您需要在发送文件后关闭套接字的写入端,以便接收方知道已到达文件的末尾:

 shutdown(client_fd, SHUT_WR); 

shutdown()用来代替close() ,这样你就可以看出对方是否成功收到了整个文件)。

然后你的阅读方将看到文件结束( read()返回0),此时它应该close()它的套接字结束。 然后服务器将看到文件结束,它也可以关闭其套接字(并记录成功的传输)。