目前实现:查找文件,下载服务器文件;
存在问题:下载的文件有乱码。
代码如下
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ERRLOG(msg)do{\
printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\
perror(msg);\
exit(-1);\
}while(0);
int main(int argc, char const *argv[])
{
if(argc!=3)
{
printf("a.out xxx xxx\n");
exit(-1);
}
// 创建用户数据报套接字.
static int sockfd;
NAME:
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
ERRLOG("socket error");
// 填充服务器网络信息结构体
printf("请输入文件名->");
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[2]));
serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
socklen_t serveraddr_len=sizeof(serveraddr);
char name[32]={0};
fgets(name,32,stdin);
name[strlen(name)-1]='\0';
char buff[600]={0};
//方式3:可以使用sprintf来组装
while(1){
int nbytes=sprintf(buff,"%c%c%s%c%s%c",0,1,name,0,"octet",0);
//发送请求给服务器
if(sendto(sockfd,buff,nbytes,0,(struct sockaddr*)&serveraddr,serveraddr_len)==-1)
{
ERRLOG("sendto error");
}
if((nbytes=recvfrom(sockfd,buff,sizeof(buff),0,(struct sockaddr*)&serveraddr,&serveraddr_len))==-1)
ERRLOG("sendto error");
// 解析数据
short code=0;
short num=0;
char txt[512]={0};
int fd;
code=ntohs(*(short*)buff);
num=ntohs(*(short*)(buff+2));
strncpy(txt,buff+4,nbytes-4);
if(strcmp(txt,"File not found")==0){
printf("%s\n",txt);
memset(txt,0,512);
goto NAME;
}
if((fd=open(name,O_WRONLY|O_CREAT|O_APPEND,0666))==-1)
ERRLOG("open error");
write(fd,txt,nbytes);
if(strlen(txt)<512){
printf("下载完成..\n");
break;
}
char acknum[10]={0};
nbytes=sprintf(acknum,"%c%c%c%c",0,4,0,num);
close(fd);
if(sendto(sockfd,acknum,120,0,(struct sockaddr*)&serveraddr,serveraddr_len)==-1)
{
ERRLOG("sendto error");
}
}
close(sockfd);
return 0;
}