基于TCP实现简单网络计算器
这里我们需要简单实现网络版的计算器,我打算让它具有计算加法,减法,乘法,除法,还有取模 的功能。
例如(加法),我们需要实现一个服务器版的加法器,我们需要客户端把要计算的两个加数发过去,然后由服务端进行计算,最后把计算结果返回给客户端。
按照这个思路,客户端每次应该发送两个加数和一个操作符,如果要把这些数据分三次发送或者两次发送,在一个服务端对应多个客户端的时候,数据就会混乱,便于避免,我们应该一次发送这些数据。一种方法,可以把数据和操作符整体看做一个字符串发送过去,然后服务端接收到后按照它们的约定正确的解析出数据和操作数(分割),进行计算,再把结果返回给客户端。再一种方法,我们可以定义一个结构体来表示每次要交互的信息,直接给服务端发送结构体,然后服务端按照它们的约定对数据进行计算,再把结果返回给客户端,这里要想想,如果你进行了除0,模0,或者操作符非法的计算,那么计算的结果还有意义吗?所以可以定义一个状态数,比如规定,状态码为0则代表此次计算有意义,其余状态码值对应此次具体非法的操作,这里状态码也要返回给客户端。
下面就直接上代码啦,这里采用的是结构体的方法:
//Counter.hpp
#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
using namespace std;
typedef struct Reques
{int x;int y;char op;//caizoufu
}Reques;
typedef struct Respons
{int status;int result;
}Respons;
服务端:Server.cc
#include"Counter.hpp"int main()
{int sock=socket(AF_INET,SOCK_STREAM,0);if(sock<0){cerr<<"socket fail..."<<endl;exit(1);}struct sockaddr_in local;local.sin_family=AF_INET;local.sin_addr.s_addr=htonl(INADDR_ANY);local.sin_port=htons(8080);int ret1=bind(sock,(struct sockaddr *)&local,sizeof(local));if(ret1<0){cerr<<"bind fail..."<<endl;exit(2);}int ret2=listen(sock,6);if(ret2<0){cerr<<"listen fail..."<<endl;exit(3);}struct sockaddr_in peer;while(1){socklen_t len=sizeof(peer);int onesock=accept(sock,(struct sockaddr *)&peer,&len);if(onesock<0){cerr<<"accept fail..."<<endl;continue;}cout<<"Get a new line..."<<endl;while(1){Reques q;int ret3=recv(onesock,(void *)&q,sizeof(q),0);if(ret3==0){cerr<<"Client close..."<<endl;exit(4);}if(ret3<0){cerr<<"revc fail..."<<endl;exit(5);}Respons p={0,0};switch(q.op){case '+':p.result=q.x+q.y;break;case '-':p.result=q.x-q.y;break;case '*':p.result=q.x*q.y;break;case '/':if(q.y==0)p.status=1;else p.result=q.x/q.y;break;case '%':if(q.y==0)p.status=2;elsep.result=q.x%q.y;break;default:p.status=3;break;
}
send(onesock,(void *)&p,sizeof(p),0);
}
close(onesock);
}return 0;
}
客户端:Client.cc
#include"Counter.hpp"int main()
{int sock=socket(AF_INET,SOCK_STREAM,0);if(sock<0){cerr<<"socket fail..."<<endl;exit(1);}struct sockaddr_in local;local.sin_family=AF_INET;local.sin_port=htons(8080);local.sin_addr.s_addr=inet_addr("127.0.0.1");while(1){socklen_t len=sizeof(local);int ret1=connect(sock,(struct sockaddr *)&local,len);if(ret1<0){cerr<<"connect fail..."<<endl;exit(2);}while(1){Reques q;cout<<"please into op: (q--quit) ";cin>>q.op;if(q.op=='q')break;cout<<"please into two inter: ";cin>>q.x>>q.y;int ret2=send(sock,(void *)&q,sizeof(q),0);if(ret2<0){cerr<<"send fail..."<<endl;exit(3);}Respons p;int ret3=recv(sock,(void *)&p,sizeof(p),0);if(ret3<0){cerr<<"recv fail..."<<endl;exit(4);}cout<<"status:"<<p.status<<endl;cout<<"result:"<<p.result<<endl;}close(sock);}return 0;
}
运行情况:(Linux)左边是服务端运行,右边是客户端运行呐
若有错误,欢迎指正:)
基于TCP实现简单网络计算器相关推荐
- 用C#实现基于TCP协议的网络通讯
TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...
- 用C#实现基于TCP协议的网络通讯(2)
2008-09-09 19:36 作者: 出处:www.4oa.com ( 11 ) 砖 ( 12 ) 好 评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...
- 用C#实现基于TCP协议的网络通讯(1)
2008-09-09 19:35 作者: 出处:www.4oa.com ( 11 ) 砖 ( 12 ) 好 评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...
- 基于TCP协议的网络聊天室
创建服务端程序 public class Server {public static void main(String[] args) {new Thread(new ServerTask()).st ...
- 基于TCP协议的网络摄像头的设计与实现
一.摘要 基于TCP协议的网络摄像头的设计大部分和博文"基于UDP协议的网络摄像头的设计与实现"相同,本篇博文采用的TCP协议栈为NicheStack协议栈(同理,可使用LWIP协 ...
- 基于TCP的简单服务器
基于Tcp的简单服务器 UDP协议无连接类似于发微信 TCP协议有链接类似于打电话 所以基于TCP的服务器先要到内核中获取一个TCP连接,UDP不需要获取连接 TCP的连接管理是由操作系统的内核来管理 ...
- 篡改计算机网络,基于TCP协议的网络数据实时篡改.doc
基于TCP协议的网络数据实时篡改 基于 TCP 协议的网络数据实时篡改 金 瓯,施 勇,薛 质(上海交通大学信息安全工程学院,上海 200240)[摘 要]首先对网络数据实时篡改作了定义,指出攻击者介 ...
- ARM开发(9)基于STM32的简单四则运算计算器
基于STM32的简单四则运算计算器 一 计算器原理: 1.1 本实验实现基于STM32的简单四则运算计算器 1.2 实验思路:理解计算器原理(按键扫描,字符实时显示,运算表达式计算,浮点数转字符串,字 ...
- 基于TCP协议的网络程序(基础学习)
下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...
最新文章
- left join 和 left outer join 有什么区别
- 几种常用通信协议:IIC协议、SPI协议、UART协议
- 跟我一起考PMP---项目范围管理
- 漫步微积分二十七——曲线下的面积 定积分 黎曼
- python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...
- C语言算法碎碎记录之“一圈人,数到几的人就出去,最后一个是几号”
- shell 构建脚本基础
- 翻译:您在Swift 5中的第一个UITest
- android view分析工具栏,如何在Android工具栏中使用SearchView
- 中缀表达式 转 前缀表达式
- 心语家园系统维护工具箱v1.0
- java计算机毕业设计中小学生错题管理系统源码+数据库+系统+lw文档+mybatis+运行部署
- itune音乐排行榜:法国周榜TOP100(2022年7月16日)
- 前端面试题——浏览器原理 高频
- 美服行星边际2服务器维护时间,行星边际2美服证书 快速起步攻略新手必读
- matlab绘制平面等值线图
- Fiddler抓包简易教程
- 计算机软件开发如何提高效率,开发人员必知:提高工作效率的7个技巧
- 最重要的财富——信用:守信重于生命
- 很强的nginx rewrite研究(强烈推荐…