#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <assert.h>
#include <errno.h>
#include <sys/sendfile.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int CreatSock(){
int sockfd=socket(AF_INET,SOCK_STREAM,0);
assert(sockfd!=-1);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(20021);
addr.sin_addr.s_addr=inet_addr("192.168.192.128");
// addr.sin_addr = *((struct in_addr *)host->h_addr);
int res=connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));
assert(res!=-1);
// printf("连接成功\n");
return sockfd;
}
void DoList(int sockfd){
char command[128]={0};
fgets(command,128,stdin);
int length=strlen(command);
send(sockfd,&length,4,0);//向服务端发送命令长度
command[strlen(command)-1]=0;
send(sockfd,command,128,0);//向服务端发送 命令get filename
char buff[1024]={0};
recv(sockfd,buff,1024,0);
printf(“命令的执行结果是:\n%s”,buff);
}
int getfile(int sockfd){
char command[128]={0};
fgets(command,128,stdin);
if(strncmp(command,"get ",4)!=0 ){
printf(“请按照get filename格式输入命令\n”);
return -1;
}
int length=strlen(command);
send(sockfd,&length,4,0);//向服务端发送命令长度
command[strlen(command)-1]=0;
send(sockfd,command,128,0);//向服务端发送 命令get filename
char p[1024]={0};
recv(sockfd,p,20,0);
printf("%s\n",p);
// printf("bucunzi \n");
if(strcmp(p,"file does not exist")==0){
printf("文件不存在,请重新输入\n");
return 0;
}
memset(p,0,sizeof(p));
char *name=strtok(command," ");
int n=0;
recv(sockfd,&n,4,0);
// printf(“wen jian da xaio\n”);
printf(“文件的大小:%d\n”,n);
name=strtok(NULL," ");//切割函数,name就是要下载的 filename
int fd=open(name,O_CREAT|O_WRONLY,0777);//打开或创建 name
printf("new file: %s\n",name);
int count=n%1024;
int num=count+1;
while(count!=num){
num=recv(sockfd,p,1024,0);//接收服务端的 file文件数据
int f=write(fd,p,num);//像客户端的 文件描述符 写数据
printf("写文件: %d\n",f);
}
//close(sockfd);
return 1;
}
int main(){
int sockfd=CreatSock();
int choice=0;
while(1){
printf("-------------------\n");
printf("1 服务器文件查询\n ");
printf(“2 get file\n”);
printf(“3 退出\n”);
printf("输入对应选项的序号\n");
scanf("%d",&choice);
getchar();
switch(choice){
case 1:
DoList(sockfd);
break;
case 2:
getfile(sockfd);
break;
case 3:
printf("客户端关闭\n");
close(sockfd);
exit(1);
}
}
close(sockfd);
printf("客户端关闭\n");
return 0;
}