应用层协议的设计与实现
1、问题
2、小知识
- 发送缓冲区
- 数据先进入发送缓冲区,之后由操作系统送往远端主机
- 接收缓冲区
- 远端数据被操作系统收到后放入接收缓冲区
- 之后应用程序从接收缓冲区读取数据
3、TCP应用编程中“问题”
数据接收端无法知道数据的发送方式
4、网络编程中期望
- 每次发送一条完整的消息,每次接收一条完整的消息
- 及时接收缓冲区中有多条消息,也不会出现消息粘连
- 消息中涵盖了数据类型和数据长度等信息
5、应用层协议设计
- 什么是协议?
- 协议是通信双方为数据交换而建立的规则、标准或约定的集合
- 协议对数据传输的作用
- 通信双发根据协议能够正确收发数据
- 通信双方根据协议能够解释数据的意义
6、协议设计示例
- 目标:设计可用于数据传输的协议
- 完整消息包含
- 数据头:数据类型(即:数据区用途,固定长度)
- 数据长度:数据区长度(固定长度)
- 数据区:字符数据(变长区域)
7、编程实验
//message.c
#include "message.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
Massage* Massage_New(unsigned short type,
unsigned short cmd,
unsigned short index,
unsigned short total,
const char* payload,
unsigned int length)
{
Massage* ret = malloc(sizeof(Massage) + length);
if(ret)
{
ret->type = type;
ret->cmd = cmd;
ret->index = index;
ret -> total = total;
ret->length = length;
if(payload)
{
memcpy(ret + 1, payload, length);
}
}
}
//message.h
#ifndef _MESSAGE_DITAI_H_
#define _MESSAGE_DITAI_H_
typedef struct massage
{
unsigned short type;
unsigned short cmd;
unsigned short index;
unsigned short total;
unsigned int length;
unsigned char payload[];
}Massage;
Massage* Massage_New(unsigned short type,
unsigned short cmd,
unsigned short index,
unsigned short total,
const char* payload,
unsigned int length);
#endif