通过自定协议实现网络计算器

本文介绍了一种自定制的应用层协议实现方式,通过结构体定义数据格式,在客户端和服务端之间进行数据交换。利用TCP协议进行网络通讯,演示了简单的算术运算交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定制协议:程序员自己设计的数据传输格式,为应用层协议。是两个应用之间通过特殊的格式来传输和接收数据。我们使用一个结构体来存储数据经行数据的传输。

定义一个结构体 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 }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值