Linux学习_自定义网络协议

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习_自定义网络协议相关的知识,希望对你有一定的参考价值。

自定义协议

定义如http的头部协议
协议结构:

  • 协议头部
    • 头部
    • 校验码
  • 协议体部
    • 要传输的数据
  1. 头文件
/*
 * 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

  1. 定义文件
/*
 * 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;		
}


以上是关于Linux学习_自定义网络协议的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode 配置 用户自定义代码片段 自定义自动代码补充

Linux网络学习_socket套接字

网络协议栈学习socket 本质