void WQQ(int sfd,struct sockaddr_in sin) //上传
{
int fd;
char buf[516]="";
char buf2[128]="";
printf("请输入要复制的文件名:");
scanf("%s",buf2);
if((fd = open(buf2,O_RDONLY))==-1)
{
ERR_MSG("open");
return ;
}
int size = sprintf(buf,"%c%c%s%c%s%c",0,2,buf2,0,"octet",0);
if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return ;
}
socklen_t addrlen = sizeof(sin);
unsigned short num = 0;
ssize_t res;
while(1)
{
bzero(buf,sizeof(buf));
if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen)<0)
{
ERR_MSG("recvfrom");
return ;
}
if(buf[1]==4)
{
if(htons(num)==*(short int*)(buf+2))
{
num++;
bzero(buf,sizeof(buf));
if((res=read(fd,buf+4,512))<0)
{
printf("传入失败\n");
break;
}
printf("%s",buf+4);
if(res==0)
{
printf("上传成功\n");
break;
}
printf("%s",buf);
short *ptr1 =(short *)buf;
*ptr1 =htons(3);
ptr1++;
*ptr1 = htons(num);
sprintf(buf,"%c%c",0,3);
if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("sendto");
return ;
}
printf("发送成功\n");
}
}else if(buf[2]==5)
{
printf("%s\n",buf+4);
break;
}
}
close(fd);
}
int main(int argc, const char *argv[])
{
int sfd =socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port =htons(PORT);
sin.sin_addr.s_addr =inet_addr(IP);
printf("******************************\n");
printf("************1.复制文件********\n");
printf("************2.传输文件********\n");
printf("************3.退出系统********\n");
printf("******************************\n");
char c;
while(1)
{
c = getchar();
switch(c)
{
case '1':
{
RQQ(sfd,sin);
printf("复制成功,请重新选择:");
getchar();
break;
}
case '2':
{
WQQ(sfd,sin);
printf("上传成功,请重新选择:");
getchar();
break;
}
case '3':
{
exit(1);
}
default:
printf("输入错误,请重新输入\n");
break;
}
}
return 0;
}
上传