自定制协议:程序员自己设计的数据传输格式,为应用层协议。是两个应用之间通过特殊的格式来传输和接收数据。我们使用一个结构体来存储数据经行数据的传输。
定义一个结构体 struct data
{
int a;用来存放第一个数据
int b;用来存放第二个数据
char c;用来存放第三个数据
}
其余的都是基于tcp协议的网络通讯。只是在send和recv的时候我们传输的是这个结构体。通过结构体来成数据转化为我们所能理解的格式.
直接上代码
//客户端
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<string.h>
5 #include<sys/socket.h>
6 #include<sys/types.h>
7 #include<arpa/inet.h>
8 #include<netinet/in.h>
9 #include<errno.h>
10 struct data
11 {
12 int a;
13 int b;
14 char c;
15 };
16 int main(int argc,char *argv[])
17 {
18 if(argc!=3)
19 {
20 perror("port ip");
21 return -1;
22 }
23 int sockfd=socket(AF_INET,SOCK_STREAM,0);
24 if(sockfd<0)
25 {
26 perror("socket error");
27 return -1;
28 }
29 struct sockaddr_in cil_addr;
30 cil_addr.sin_family=AF_INET;
31 cil_addr.sin_port=htons(atoi(argv[2]));
32 cil_addr.sin_addr.s_addr=inet_addr(argv[1]);
33 socklen_t len=sizeof(struct sockaddr_in);
34 int ret=connect(sockfd,(struct sockaddr*)&cil_addr,len);
35 if(ret<0)
36 {
37 perror("connect error");
38 return -1;
39 }
40 while(1)
41 {
42 struct data dates;
43 int size=sizeof(struct data);
44 printf("第一个数字\n");
45 scanf("%d",&dates.a);
46 printf("第二个数字\n");
47 scanf("%d",&dates.b);
48 printf("运算符\n");
49 scanf("%s",&dates.c);
50 send(sockfd,(void*)&dates,size,0);
51 int num;
52 recv(sockfd,(void*)&num,4,0);
53 printf("结果为:%d",num);
54 }
55 close(sockfd);
56 }
57
//服务端
1 #include<stdio.h>
2 #include<error.h>
3 #include<sys/types.h>
4 #include<sys/socket.h>
5 #include<unistd.h>
6 #include<arpa/inet.h>
7 #include<string.h>
8 #include<netinet/in.h>
9 #include<stdlib.h>
10
11 struct date
12 {
13 int a;
14 int b;
15 char c;
16 };
17
18 int main(int argc,char* argv[])
19 {
20 if(argc!=3)
21 {
22 printf("ip,port");
23 return -1;
24 }
25
26 int socked=socket(AF_INET,SOCK_STREAM,0);
27 if(socked==0)
28 {
29 perror("socket error");
30 return -1;
31 }
32 struct sockaddr_in lst_addr;
33 lst_addr.sin_family=AF_INET;
34 lst_addr.sin_port=htons(atoi(argv[2]));
35 lst_addr.sin_addr.s_addr=inet_addr(argv[1]);
36 socklen_t len=sizeof(struct sockaddr_in);
37 int ret =bind(socked,(struct sockaddr*)&lst_addr,len);
38 if(ret<0)
39 {
40 perror("bind error");
41 return -1;
42 }
43 if(listen(socked,5)<0)
44 {
45 perror("listen error");
46 return -1;
47 }
48
49 while(1)
50 {
51 int newsock;
52 struct sockaddr_in cil_addr;
53 len=sizeof(struct sockaddr_in);
54 newsock=accept(socked,(struct sockaddr*)&cil_addr,&len);
55 if(newsock<0)
56 {
57 perror("new sockerror");
58 continue;
59 }
60 while(1)
61 { struct date dates;
62 int size=sizeof(struct date);
63 ssize_t lec=recv(newsock,(void*)&dates,size,0);
64 if(lec<0)
65 {
66 perror("recv error");
67 close(newsock);
68 continue;
69 }
70 else if(lec==0)
71 {
72 printf("shutdown");
73 close(newsock);
74 continue;
75 }
76 int num;
77 char t=dates.c;
78 switch(t)
79 {
80 case '+':
81 num=dates.a+dates.b;
82 break;
83 case '-':
84 num=dates.a-dates.b;
85 break;
86 case '*':
87 num=dates.a*dates.b;
88 break;
89 case'/':
90 num=dates.a/dates.b;
91 break;
92 }
93 send(newsock,(void *)&num,4,0);
94 }
95 }
96 close(socked);
97 }