协议
计算机网络中为进行数据交换而建立的规则。
序列化和反序列化
定义结构体来存放要交互的信息,发送数据时将这个结构体按照一个规则转换成字符串,接受到数据时按照相同的规则把字符串转换成回结构体。
网络版计算器
实现一个服务器版的计算器,客户端把要计算的数据发送给服务器端,服务器端计算完之后再将结构返还给客户端。
方案一:
约定好规则,客户端按照规则发送数据,比如,客户端发送一个"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框架