自定义协议
定义如http的头部协议
协议结构:
- 协议头部
- 头部
- 校验码
- 协议体部
- 要传输的数据
- 头文件
/*
* msg.h
*
*/
#ifndef __MSG_H__
#define __MSG_H__
#include <stddef.h>
typedef struct{
//协议头部
char head[10];
char checknum; //校验码
//协议体部
char buff[512]; //数据
}Msg;
/*发送一个基于自定义协议的message
* 发送的数据存放在buff中
*/
extern int write_msg(int sockfd,
char* buff, size_t len);
/*读取一个基于自定义协议的message
* 读取的数据存放在buff中
*/
extern int read_msg(int sockfd,
char* buff, size_t len);
#endif
- 定义文件
/*
* msg.c
*
*/
#include "msg.h"
#include <unistd.h>
#include <string.h>
#include <memory.h>
#include <sys/types.h>
//#include <>
//计算校验码
static unsigned char msg_check(Msg *message)
{
unsigned char s = 0;
int i;
for(i=0;i<sizeof(message->head);i++){
s += message->head[i];
}
for(i=0;i<sizeof(message->buff);i++){
s += message->buff[i];
}
return s;
}
/*发送一个基于自定义协议的message
* 发送的数据存放在buff中
*/
int write_msg(int sockfd,
char* buff, size_t len)
{
Msg message;
memset(&message,0,sizeof(message));
strcpy(message.head, "xuwenhan");
memcpy(message.buff,buff,len);
message.checknum = msg_check(&message);
if(write(sockfd,&message,
sizeof(message))!=sizeof(message))return -1;
return sizeof(message);
}
/*读取一个基于自定义协议的message
* 读取的数据存放在buff中
*/
int read_msg(int sockfd,
char* buff, size_t len)
{
Msg message;
memset(&message,0,sizeof(message));
size_t size;
if((size = read(sockfd,&message,\
sizeof(message)))<0)return -1;
else if(size==0)return 0;//没有数据
//校验码验证,判断接收到的message是否完整
unsigned char s = msg_check(&message);
if(s==(unsigned char)message.checknum
&& (!strcmp("xuwenhan",message.head)))
{
memcpy(buff,message.buff,len);
return sizeof(message);
}
return -1;
}