目录

  • 什么是协议?
  • TCP简易版网络计算器
    • protocol.hpp(协议)
    • server.hpp
    • server.cc
    • client.hpp
    • client.cc
    • 总结

什么是协议?

协议就是一种约定,类似客户端与服务器之间为便于交互而制定的约定;

TCP简易版网络计算器

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

方案一:

客户端发送类似于"1+1"的字符串,server收到以后进行解析,计算出结果再返回给客户端;

则有规定:

  • 这个字符串中有两个操作数, 都是整形;
  • 两个数字之间会有一个字符是运算符, 运算符只能是 + ;
  • 数字和运算符之间没有空格;

方案二:

定义结构体来表示我们需要交互的信息;

规定:

//请求
struct Request{int a;//操作数aint b;//操作数bchar op;//操作类型:+-*/%
};//规定进行a op b运算;
//响应
struct Response{int statu = 0;//返回状态码,正常0,异常-1;int ret;//运算结果:规定返回a op b 的结果 ret;
};

显然方案一和方案二都能完成需求,上述的规定,就是一种server与client为了方便交互而进行的约定,也就是一种协议,下面采取方案2实现;

protocol.hpp(协议)

//请求
struct Request{int a;//操作数aint b;//操作数bchar op;//操作类型:+-*/%
};//规定进行a op b运算;
//响应
struct Response{int statu = 0;//返回状态码,正常0,异常-1;int ret;//运算结果:规定返回a op b 的结果 ret;
};

server.hpp

#pragma once
#include "protocol.hpp"
#include <iostream>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/wait.h>
#include <cstdio>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
#include <pthread.h>
#include <string>
using namespace std;
class TcpServer
{int listen_sock;int _port;public:TcpServer(int port) : _port(port){}void Init(){listen_sock = socket(AF_INET, SOCK_STREAM, 0);sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(_port);server.sin_addr.s_addr = INADDR_ANY;if (bind(listen_sock, (sockaddr *)&server, sizeof(server))){cerr << "bind error" << endl;exit(1);}//服务器初始化完成,进入监听状态;listen(listen_sock, 5);}static void *fun(void *p) //类里搞多线程的执行函数毕需static,不然会多一个参数导致匹配不上;{int sock = *(int *)p;delete (int*)p;while (true){Request rq;Response rs;int c = recv(sock, &rq, sizeof(rq), 0); //接收数据,类似于read, 少了一个反序列化(将所收数据转成对应的类型录入)if (c > 0){  char op = rq.op;int a = rq.a;int b = rq.b;cout<<"client send:"<<a<<op<<b<<endl;switch (op){ //进行运算;case '+':rs.ret = a + b;break;case '-':rs.ret = a - b;break;case '*':rs.ret = a * b;break;case '/':if (b == 0){rs.statu = -1; //运算格式错误;break;}rs.ret = a / b;break;case '%':if (b == 0){rs.statu = -1; //运算格式错误;break;}rs.ret = a % b;break;default:rs.statu = -1; //运算格式错误;}send(sock, &rs, sizeof(rs), 0); //发回数据,类似于write,少了一个序列化(将所发数据转成一个字符串发送出去)}else{cout<<"client close!,me too"<<endl;close(sock);break;}}return nullptr;}void Loop(){while (true){sockaddr_in peer;peer.sin_family = AF_INET;peer.sin_port = htons(_port);peer.sin_addr.s_addr = INADDR_ANY;socklen_t len = sizeof(peer);int sock = accept(listen_sock, (sockaddr *)&peer, &len); //连接到client的socket;int *p = new int(sock);                                  //防止局部sock销毁导致找不到sock,搞堆上;pthread_t tid;pthread_create(&tid, 0, fun, p);pthread_detach(tid); //线程分离,直接accept下一个client的连接,实现并发}}~TcpServer(){if (listen_sock >= 0)close(listen_sock);}};

server.cc

#include"server.hpp"int main(int argc,char*argv[])
{TcpServer svr(atoi(argv[1]));svr.Init();svr.Loop();return 0;}

client.hpp

#pragma once
#include"server.hpp"
class Client{char* _ip;int _port;int sock;public:Client(char* ip,int port):_ip(ip),_port(port){}void Init(){sock = socket(AF_INET,SOCK_STREAM,0);//client不需要bind listen之类的了}void Run(){sockaddr_in peer;peer.sin_family = AF_INET;peer.sin_port = htons(_port);peer.sin_addr.s_addr = inet_addr(_ip);connect(sock,(sockaddr*)&peer,sizeof(peer));while(true){Request rq;Response rp;cout<<"请输入第一个数据:";cin>>rq.a;cout<<"请输入运算符:";cin>>rq.op;cout<<"请输入第二个数据:";cin>>rq.b;send(sock,&rq,sizeof(rq),0); //发数据,类似于write,少了一个序列化(将所发数据转成一个字符串发送出去)int c = recv(sock,&rp,sizeof(rp),0); //接收数据,类似于read, 少了一个反序列化(将所收数据转成对应的类型录入)if(rp.statu!=0){cout<<"输入有误!statu:"<<rp.statu<<endl;continue;}if(c>0){cout<<"运算结果:"<<rp.ret<<endl;}}}~Client(){if(sock>=0) close(sock);}
};

client.cc

#include"client.hpp"
int main(int argc,char*argv[])
{Client cl(argv[1],atoi(argv[2]));cl.Init();cl.Run();return 0;
}

运行结果:

总结

这里订制的协议就是当服务器获得client发出的request类型以后,需要计算出其三个成员a op b的结果,顺序类型都已固定不可变,结果存入response类型后返回给client,client使用一个response类型进行接收;

TCP网络计算器--认识网络协议相关推荐

  1. 自定协议实现网络计算器

    这里我们的自定执行协议和TCP.UDP.IP这些协议不同,我们自定制的协议是应用层的协议.是我们这两个应用所应用的一种特殊传输和接受数据的方式,这里我们是通过结构体来存储数据的,也可以定义一个字符串, ...

  2. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  3. 网络:TCP/IP各层的协议

    教程书上虽然介绍了这些协议,但是就单个协议分别介绍的,很容易忘了这个协议属于那一层,以及属于底层哪个协议. 上图TCP/IP各层的协议很多,一张图就可以记住了. 应用层协议 0.  运行 在TCP\U ...

  4. Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

  5. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

  6. TCP/IP网络协议栈:IP协议

    <TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...

  7. TCP/IP网络协议栈:ARP协议详解

    <TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...

  8. 网络分层,网络协议TCP/IP模型,OSI模型

    TCP\IP模型是多种协议的综合,4层模型(也有说5层的). 其中最重要的就是分层结构和主要协议. 1.应用层(SMTP,HTTP,FTP) 2.传输层(TCP,UDP) 3.网络互联层(IPv4,I ...

  9. 【Sofice小司笔记】5 计算机网络,包含数据传输原理、网络各层协议详细说明、TCP/IP协议栈各常用协议说明、TCP握手挥手、可靠传输、网络加密技术

    ❓ 在浏览器地址栏输入一个 URL 后回车,背后发生了什么 解析 URL 浏览器封装 HTTP 请求报文 DNS 域名解析获取 IP 地址 建立 TCP 连接(长链接) 浏览器发送请求 负责传输的 I ...

最新文章

  1. centos7配置bind重启后错误解决
  2. 题目1154:Jungle Roads
  3. nyist 541最强DE 战斗力
  4. BZOJ4004: [JLOI2015]装备购买
  5. PHP 调用web service接口(.net开发的接口)
  6. 和硕看重物联网大势 程建中:从擅长领域出发
  7. JS调用后台方法大全
  8. 今后最有前途的媒体格式 MXF
  9. c语言程序设计报告用于医院食品加工等部,南开(本部)《C语言程序设计》14春在线作业答案...
  10. pytorch1.0神经网络保存、提取、加载
  11. 广告深度预估技术在美团到店场景下的突破与畅想
  12. 电脑格式化的危害_防止硬盘被格式化的六大方法
  13. win11能否安装cad Windows11安装cad的解决方法
  14. 数数FastJson那些年犯下的'血案'...
  15. Java面试题-Java中的锁
  16. 10-Python-mapfilter
  17. Windows 10, version 22H2 (updated March 2023) 简体中文版、英文版下载
  18. Mybatis中#和$的区别
  19. 建水实验中学2021高考考成绩查询,高三第一次省统测成绩发布 建水实验中学低进高出、强势崛起...
  20. VIC水文模型入门攻略(中)VIC的数据和输入文件准备

热门文章

  1. 华硕 TUF GAMING B660M-PLUS WIFI D4 i5-12400F GTX 1050电脑 Hackintosh 黑苹果efi引导文件
  2. php根据用户积分判断用户等级,一篇说清楚“会员制” “用户等级” “积分体系”...
  3. 足球数据【文字直播】API调用示例代码
  4. python做彩色字_python在命令行打印彩色文字
  5. 【译】 我从高薪科技工作中学到的惨痛教训#IT人的升职加薪tips#
  6. 不学中国话了,中年小扎要聚焦“一个年代的变化”
  7. 几行代码,撸了个 元宇宙?!
  8. 真相只有一个!厉害了,用 IDEA 神器看源码,效率真高!
  9. unity之A*寻路
  10. 动态规划 漫画 台阶 算法