再谈“协议”
1. 基本概念
我们知道,协议就是一种“约定”。套接字实现的网络通信的接口,在读写数据时,都是按照“字符串”的方式来发送和接收的,那如果我们要传输一些“结构化的数据”,该怎么办呢?
这里我们就要提出两个概念:
(1)序列化:将对象的状态信息转化为可以存储或是可以传输的形式的过程,比如将结构体等类型转化为字符串类型;
(2)反序列化:将可以存储或是可以传输的形式转化为对象的状态信息的过程,比如将字符串类型转化为结构体等类型。
2. 具体实现
比如,我们要实现一个网络版的加法计算器,有两种方法:
(1)客户端向服务器端发送一个形容“1+1”的字符串,该字符串以“+”为分隔,有两个操作数,且两个操作数都是整型,“+”即为运算符,且只能是“+”,同时数字与运算符间不能有空格。
(2)我们可以定义两个结构体来表示我们要交互的信息,一个用于传输要计算的数据,一个用于接收计算后的结果。发送数据时通过序列化将数据转换为一个字符串,接收时通过反序列化再将字符串转回结构体,具体实现代码如下:
1)要用到的头文件,以及结构体的定义:
#pragma once
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h