网络基础(2)

协议

计算机网络中为进行数据交换而建立的规则。

序列化和反序列化

定义结构体来存放要交互的信息,发送数据时将这个结构体按照一个规则转换成字符串,接受到数据时按照相同的规则把字符串转换成回结构体。

网络版计算器

实现一个服务器版的计算器,客户端把要计算的数据发送给服务器端,服务器端计算完之后再将结构返还给客户端。
方案一:
约定好规则,客户端按照规则发送数据,比如,客户端发送一个"1+1"的字符串,
这个字符串中有两个操作数,都是整型,
两个数字之间会有一个运算符,运算符只能是“+”,
数字和运算符之中没有空格
方案二:
对数据进行序列化发送和反序列化接收处理,方便发送和接收

实现一个网络计数器
协议 protocal.hpp

#pragma once

#include<iostream>

using namespace std;

struct Request{
	int x;//左操作数
	int y;//右操作数
	char op;//操作符,+-*/%
}
struct Response{
	int status; //状态码
	int result; //结果
}

服务器端 server.cc

#include"protocal.hpp"

void* Routine(void* argvs)
{
	 pthread_detach(pthread_self());
	 int sock =* (int*) args;         
	 delete (int*)args;
	 Request rq;
	 while(1){
	 	ssize_t s = recv(sock,rq,sizeof(rq),0);
	 	if(s>0){
	 	Response rsp = {0,0};
	 	swich(rq.op){
	 		case '+':
	 			rsp.result = rq.x + rq.y;
	 			break;
	 		case '-':
	 			rsp.result = rq.x + rq.y;
	 			break;
	 		case '*':
	 			rsp.result = rq.x + rq.y;
	 			break;
	 		case '/':
	 			if(0==rq.y){
	 				rsp.status = 1;
	 				}
	 			else{
	 				rsp.result = rq.x + rq.y;
	 				break;
	 				}
	 			break;
	 		case '%':
	 			if(0==rq.y){
	 				rsp.status = 1;
	 				}
	 			else{
	 			rsp.result = rq.x + rq.y;
	 			break;
	 			}
	 			break;
	 		default:
	 			rsp.status = 3;
	 			break;
	 	}
	 	else if(s==0){
	 		cout << " client quit " << endl;
	 		break;
	 	}
	 	else
	 	{
	 		break;
	 	}
	}
	close(sock);
}

int main(){
	//1.创建套接字
	int listen_sock=socket(AF_INET,SOCK_STREAM,0);
	//判断套接字是否创建成功
	if(listen_sock<0){
		cerr << " listen_sock " <<endl;
		exit(1);
	}
	struct sockaddr_in local;
	local.sin_family = AF_INET;
	local.sin_port = htons(8888);
	local.sin_addr.s_addr = htonl(INADDR_ANY);
	
	//2.绑定端口号
	if(bind(listen_sock,(struct void*)&local,sizeof(local)<0){
		cerr << "bind error" << endl;
		exit(2);
	}
	//3.监听
	if(listen(listen_sock,5)<0){
		cerr << "listen error" << endl;
		exit(3);
	}
	//开始进入循环事件
	struct sock_addr_in peer;
	for(;;){
		int sock=socket(AF_INET,SOCK_STREAM,0);
		if(sock<0){
			cerr << " sock error " << endl;
			continue;
		}
		int *s = new (int) sock;
		//创建进程
		pthread_t id;
		pthread_create(&id,nullptr,Routine,(void*)s);
		}
}

客户端 client.cc

#pragma once
#include"protocal.hpp"

int main()
{
	int sock = socket(AF_INET,SOCK_STREAM,0);
	if(sock<0){
		cerr << " sock error " << endl;
		exit(1);
	}

	struct sock_addr_in peer;
	peer.sin_family = AF_INET;
	peer.sin_port = htons(8888);
	peer.sin_addr.s_addr = inet_addr("127.0.0.1");
	
	//连接服务器
	if(connect(sock,(struct void*)&peer,sizeof(peer)<0){
		cerr << "connect error" << endl;
		exit(2);
	}
	Request rq;
	for(;;){
		cout << "Please ENTER your op< normal:+-*/%,quit:q>" ;
		cin >> rq.op >>endl;
		cout <<"Please ENTER your x,y " << endl;
		cin >> rsp.x >> rsp.y >>endl;
		send(sock,&rq,sizeof(rq),0);
		recv(sock,&rsp,sizeof(rsp),0);
		cout << " status:" << rsp.status << endl;
		cout << " result:" << rsp.result << endl;
		//关闭文件描述符
		close(sock);
}
HTTP协议

HTTP
超文本传输协议,应用层协议。
URL
在这里插入图片描述
HTTP框架
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值