这里我们需要简单实现网络版的计算器,我打算让它具有计算加法,减法,乘法,除法,还有取模 的功能。

例如(加法),我们需要实现一个服务器版的加法器,我们需要客户端把要计算的两个加数发过去,然后由服务端进行计算,最后把计算结果返回给客户端。

按照这个思路,客户端每次应该发送两个加数和一个操作符,如果要把这些数据分三次发送或者两次发送,在一个服务端对应多个客户端的时候,数据就会混乱,便于避免,我们应该一次发送这些数据。一种方法,可以把数据和操作符整体看做一个字符串发送过去,然后服务端接收到后按照它们的约定正确的解析出数据和操作数(分割),进行计算,再把结果返回给客户端。再一种方法,我们可以定义一个结构体来表示每次要交互的信息,直接给服务端发送结构体,然后服务端按照它们的约定对数据进行计算,再把结果返回给客户端,这里要想想,如果你进行了除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实现简单网络计算器相关推荐

  1. 用C#实现基于TCP协议的网络通讯

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  2. 用C#实现基于TCP协议的网络通讯(2)

    2008-09-09 19:36 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  3. 用C#实现基于TCP协议的网络通讯(1)

    2008-09-09 19:35 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  4. 基于TCP协议的网络聊天室

    创建服务端程序 public class Server {public static void main(String[] args) {new Thread(new ServerTask()).st ...

  5. 基于TCP协议的网络摄像头的设计与实现

    一.摘要 基于TCP协议的网络摄像头的设计大部分和博文"基于UDP协议的网络摄像头的设计与实现"相同,本篇博文采用的TCP协议栈为NicheStack协议栈(同理,可使用LWIP协 ...

  6. 基于TCP的简单服务器

    基于Tcp的简单服务器 UDP协议无连接类似于发微信 TCP协议有链接类似于打电话 所以基于TCP的服务器先要到内核中获取一个TCP连接,UDP不需要获取连接 TCP的连接管理是由操作系统的内核来管理 ...

  7. 篡改计算机网络,基于TCP协议的网络数据实时篡改.doc

    基于TCP协议的网络数据实时篡改 基于 TCP 协议的网络数据实时篡改 金 瓯,施 勇,薛 质(上海交通大学信息安全工程学院,上海 200240)[摘 要]首先对网络数据实时篡改作了定义,指出攻击者介 ...

  8. ARM开发(9)基于STM32的简单四则运算计算器

    基于STM32的简单四则运算计算器 一 计算器原理: 1.1 本实验实现基于STM32的简单四则运算计算器 1.2 实验思路:理解计算器原理(按键扫描,字符实时显示,运算表达式计算,浮点数转字符串,字 ...

  9. 基于TCP协议的网络程序(基础学习)

    下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...

最新文章

  1. left join 和 left outer join 有什么区别
  2. 几种常用通信协议:IIC协议、SPI协议、UART协议
  3. 跟我一起考PMP---项目范围管理
  4. 漫步微积分二十七——曲线下的面积 定积分 黎曼
  5. python类型转换方法_整理了最全的Python3数据类型转换方法,可以收藏当手册用...
  6. C语言算法碎碎记录之“一圈人,数到几的人就出去,最后一个是几号”
  7. shell 构建脚本基础
  8. 翻译:您在Swift 5中的第一个UITest
  9. android view分析工具栏,如何在Android工具栏中使用SearchView
  10. 中缀表达式 转 前缀表达式
  11. 心语家园系统维护工具箱v1.0
  12. java计算机毕业设计中小学生错题管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  13. itune音乐排行榜:法国周榜TOP100(2022年7月16日)
  14. 前端面试题——浏览器原理 高频
  15. 美服行星边际2服务器维护时间,行星边际2美服证书 快速起步攻略新手必读
  16. matlab绘制平面等值线图
  17. Fiddler抓包简易教程
  18. 计算机软件开发如何提高效率,开发人员必知:提高工作效率的7个技巧
  19. 最重要的财富——信用:守信重于生命
  20. 很强的nginx rewrite研究(强烈推荐…

热门文章

  1. stylus基础教程,stylus实例教程,stylus语法总结
  2. 原生javascript自己封装的常用小方法。
  3. 怎么在echarts上多个y轴
  4. 如何使用Insphpect确保灵活,可重用PHP代码
  5. Learning to Move with Affordance Maps译文
  6. 华为手机创建文件夹失败
  7. 江苏对口单招计算机技能历年真题,2012江苏省对口单招计算机技能试卷
  8. MatLab中函数图形的绘制
  9. flutter 底部弹框 选择农历和阳历的日期和时间
  10. 蜜汁标题,进来有料。