代码:
#include <stdio.h>
#include <IOhead.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#define PORT_SER 69
#define PORT 1024
#define IP "10.102.135.116"
#define IP_SER "10.102.134.165"
#define N 517
#define wj "1_armcli.c"
int main(int argc, const char *argv[])
{
int a=socket(AF_INET,SOCK_DGRAM,0);
if(a<0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT_SER);
sin.sin_addr.s_addr=inet_addr(IP_SER);
socklen_t addrlen=sizeof(sin);
char b[N]="";
unsigned short* p1=(unsigned short *)b;
*p1=htons(1);
char *p2=b+2;
strcpy(p2,wj);
char *p3=b+3+strlen(p2);
strcpy(p3,"octet");
size_t len=4+strlen(p3)+strlen(p2);
if(sendto(a,b,len,0,(struct sockaddr *)&sin,addrlen)<0)
{
ERR_MSG("sendto");
return -1;
}
printf("发送请求包成功\n");
ssize_t res=0;
int fp=open(wj,O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fp<0)
{
ERR_MSG("open");
return -1;
}
printf("打开文件成功\n");
while(1)
{
bzero(b,sizeof(b));
res=recvfrom(a,b,sizeof(b),0,(struct sockaddr *)&sin,&addrlen);
if(res<0)
{
ERR_MSG("recvfrom");
return -1;
}
char *p=b+4;
unsigned short *d=(unsigned short*)b;
if(3==ntohs(*d))
{
if(write(fp,p,res-4)<0)
{
ERR_MSG("write");
return -1;
}
char ACK[4]="";
*(unsigned short *)ACK=htons(4);
*((unsigned short *)ACK+1)=*(d+1);
if(sendto(a,ACK,sizeof(ACK),0,(struct sockaddr*)&sin,addrlen)<0)
{
ERR_MSG("sendto");
return -1;
}
if(res<512)
{
printf("传输完毕\n");
break;
}
}
if(5==ntohs(*d))
{
printf("error\n");
printf("%s\n",p);
}
}
//关闭所有文件描述符
close(a);
return 0;
}
运行成功后: