在C中通过套接字发送大文件

时间:2011-12-30 12:41:55

标签: c linux sockets ftp

我正在为学校项目编写一个简单的FTP服务器。项目几乎完成,我唯一的问题是通过套接字向客户端发送文件。我无法写入超过200kb数据的套接字,成功下载小文件。谁能告诉我通过Linux套接字发送大文件的正确方法是什么?

提前致谢。

PS我正在使用C和32位linux,服务器在PORT模式下工作,一直使用低级开放,写入,读取等功能,如sendfile,send,sendto。

2 个答案:

答案 0 :(得分:5)

你可以mmap文件并从那里写入套接字,你也可以使用fstat获取它的大小,如下所示:

fd = open(filename, O_RDONLY);
struct stat s;
fstat(fd, &s); // i get the size
adr = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0); // i get the adress
write(socket, adr, s.st_size); // i send the file from this adress directly

您可能希望在完全发送之前发送文件的大小。您的客户可能希望向您发送他已获得良好规模并且他可以设法下载它。

答案 1 :(得分:4)

一个想法可能是按块读取文件块,例如:

<强>伪代码

#define CHUNK_SIZE 1000

void send(){
  uint8_t buff[CHUNK_SIZE];
  int actually_read;
  while((actually_read = read(fd, buff, sizeof(buff)) > 0)
     sendto(sock_fd, buff, actually_read, 0);
}

您应该添加一些错误检查,但我们的想法是从您要发送的文件中读取大量字节并发送该数量。在服务器端,你需要做一个类似的事情,通过从套接字读取到达的块并将它们写入文件。您可能希望将一些元数据添加到buff,只是为了告诉服务器您要传输哪个文件(如果要处理多个文件传输)。由于FTP使用TCP,因此您不必担心丢失数据。

同样,这只是一个想法。我想有多种方法可以做到这一点。