我正在构建一个简单的ftp,它允许用户询问unix服务器的基本命令(例如:cd home/file/
)并将文件上传到服务器并从服务器下载文件。我已经获得了在客户端和服务器之间工作和打印的基本命令,但复制非文本文件是一项挑战。
get
函数的当前代码如下:
Cli6.c
else if (strcmp(tokens[0], "get") == 0) {
char *filecpy = convertfile("mtg.jpg");
printf("%s .... %d\n", filecpy, strlen(filecpy));
}
FTP.c
char *convertfile(const char *filename) {
FILE *fileptr;
char *buffer;
long filen;
size_t result;
fileptr = fopen(filename, "rb");
fseek(fileptr, 0, SEEK_END);
filen = ftell(fileptr);
rewind(fileptr);
printf("File size: %d\n", filen);
buffer = (char *)malloc(filen + 1); // this is only allocating 8bytes
fread(buffer,filen, 1,fileptr);
printf("Buffer: %s\n", buffer);
close(fileptr);
/*
char *c;
char *buffer;
fileptr = fopen(filename, "rb");
while (c != EOF) {
fread(&c, (size_t)1, (size_t)1, fileptr);
buffer[c]++;
c = fgetc(fileptr);
sprintf(buffer[strlen(buffer)], "%c", c);
}
close(fileptr);
*/
return buffer;
}
//convert bytes to file
void convertbytes(const char *buffer, const char *filename) {
FILE *fileptr;
printf("%s .... %d\n", buffer, strlen(buffer));
fileptr = fopen(filename, "wb");
//for (int i = 0; i < sizeof(buffer); i++) {
fwrite(buffer, 1, strlen(buffer), fileptr);
//printf("%c :: %d\n", buffer[i], i);
//}
close(fileptr);
}
现在,我只是想正确地复制文件,所以还没有发送到服务器。使用此代码,我可以正常复制文本文件,但另一个文件(如包含6.0kb的.o文件)将以8个字节复制。我正在尝试将文件转换为字节(准备发送到某处),然后从字节构建文件。我接近这个错吗?我应该使用其他方法来做到这一点吗?构建简单FTP的正确方法是什么?
答案 0 :(得分:1)
这是因为你的缓冲区充满了二进制数据。
二进制数据可以包含空字符(\ 0或0x00),并且与strlen
不兼容,因为strlen
将停留在第一个空字符处。
你可以尝试这样的东西来返回文件的实际长度:
struct buffer {
char *buffer;
size_t filelen;
}
struct buffer *convertfile(const char *filename)
{
...
}
和
struct buffer * filecpy = convertfile("mtg.jpg");
printf("%.*s .... %d\n",filecpy.filelen, filecpy.buffer, filecpy.filelen);