一个小前提:服务器正在通过套接字接收消息" get text.txt" 我必须计算该文件的大小并将其发回去,所以这是目前为止的代码:
/*Receive command
*
*/
char * file_path;
//Wait for command
if ( recvfrom (sockfd_child, command, PACKET_SIZE, 0, (struct sockaddr *) addr_client, &addr_client_lenght) < 0) {
perror("server: error in recvfrom for command packet");
exit(1);
}
//check first 4 character (COMMAND_SIZE) of command packet send by the client to identify the operation
if (!strncmp(command, "get ", COMMAND_SIZE)) {
file_path = malloc(sizeof(command)-COMMAND_SIZE);
strcpy(file_path, DIRECTORY);
strncat(file_path, command+COMMAND_SIZE, PACKET_SIZE-COMMAND_SIZE);
printf("Getting file in path: '%s'\n", file_path);
int file_size = get_file_size(file_path);
计算file_size的函数是
long get_file_size(char * file_name) {
long size;
FILE * file;
if ( !( file = fopen ( file_name , "rb" ) ) ) {
perror("file: error calculating size");
exit (1);
}
fseek (file , 0 , SEEK_END);
size = ftell (file);
rewind (file);
fclose(file);
return size;
}
DIRECTORY是一个常量,设置为./files/
COMMAND_SIZE设置为4
程序的网络部分运行良好,命令字符串成功传输。
程序在perror打印file: error calculating size: No such file or directory
中停止,但前一个printf打印文件所在的当前路径Getting file in path: './files/text.txt'
所以我猜错误在于我如何将文件路径与命令分开来得到&#39; get&#39;或者其他我无法掌握的地方。你能帮助我吗?对不起任何错误或混淆,但在这里凌晨4点:)
答案 0 :(得分:0)
听起来很明显,但请尝试使用“printf”来验证文件的名称及其路径。也许空白或其他东西有问题。顺便说一句,你可以使用脚本来计算文件的大小(如果你在linux中,你有很多命令要做),并将值作为参数传递给程序。
答案 1 :(得分:0)
查看你的malloc()。它仅为sizeof(command)-COMMAND_SIZE
分配file_path
。但它需要存储strlen(DIRECTORY) + sizeof(command)-COMMAND_SIZE
。 strncat()
和printf()
不会检查数组是否会超出范围,因此您可以获得file_path
的正确输出。
您可以将file_name
替换为./files/text.txt
中的get_file_size()
进行检查。