#include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <arpa/inet.h>
7 #include <netinet/in.h>
8 #include <unistd.h>
9 #define IP "192.168.122.14"
10 #define PORT 6666
11 #define FIL "1_armcli.c"
12 #define IP2 "192.168.122.101"
13
14 int main(int argc, const char *argv[])
15 {
16 //创建套接字
17 int cfd=socket(AF_INET,SOCK_DGRAM,0);
18 if(cfd<0)
19 {
20 perror("socket");
21 return -1;
22
23 }
24 printf("套接字创建成功\n");
25 //绑定端口号和IP
26 struct sockaddr_in sin;
27 sin.sin_family=AF_INET;
28 sin.sin_port=htons(PORT);
29 sin.sin_addr.s_addr=inet_addr(IP);
30 if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
31 {
32 perror("bind");
33 return -1;
34 }
35 printf("端口号和IP绑定成功\n");
36 socklen_t addrlen=sizeof(sin);
37 int count=0;
38 while(1)
39 {
40 if(count==0)
41 {
42 //发送下载请求
43 char rdbuf[128];
44 short int *p1=(short int *)rdbuf;
45 *p1=htons(1);
46 char *p2=(char*)(p1+1);
47 strcpy(p2,FIL);
48 char *p3=p2+strlen(p2)+1;
49 strcpy(p3,"octet");
50 struct sockaddr_in qin;
51 qin.sin_family=AF_INET;
52 qin.sin_port=htons(69);
53 qin.sin_addr.s_addr=inet_addr(IP2);
54 size_t size=4+strlen(p2)+strlen(p3);
55 printf("size=%ld\n",size);
56 ssize_t qq=sendto(cfd,rdbuf,size,0,(struct sockaddr*)&qin,sizeof(qin));
57 if(qq<0)
58 {
59 perror("下载请求失败");
60 return -1;
61
62
63 }
64 printf("下载请求发送成功\n");
65 count++;
66 }
67 //接受数据和地址信息
68 char buf[517];
69 ssize_t res=0;
70 bzero(buf,sizeof(buf));
71 struct sockaddr_in cin;
72 res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
73 if(res<0)
74 {
75 perror("recvfrom");
76 return -1;
77 }
78 printf("接受成功\n");
79 printf("%s\n",buf);
80 //找到块设备编码
81 short int *m=(short int*)(buf+2);
82 *m=ntohs(*m);
83
84 //发送数据
85 char sendbuf[128];
86 bzero(sendbuf,sizeof(sendbuf));
87 short int *q1=(short int*)sendbuf;
88 *q1=htons(4);
89 *(q1+1)=htons(*m);
90
91
92
93
94
95 ssize_t s=sendto(cfd,sendbuf,strlen(sendbuf),0,(struct sockaddr*)&cin,sizeof(cin));
96 if(s<0)
97 {
98 perror("sendto");
99 return -1;
100 }
101 printf("发送成功\n");
102 if(strlen(buf)<516)
103 {
104 printf("接受完成\n");
105 count=0;
106 break;
107 }
108
109 }
110
111 //关闭文件
112 close(cfd);
113
114
115
116
117
118 return 0;
119 }
~
~
下载项目于完成
最新推荐文章于 2024-07-08 22:12:26 发布