协议:如何实现一个最简单的通信协议(线程模拟)

 *Author  : DavidLin
 *Date    : 2014-12-20pm
 *Email   : [email protected] or [email protected]
 *world   : the city of SZ, in China
 *Ver     : 000.000.001
 *For     : threads for rxtx!
 *history :     editor      time            do
 *          1)LinPeng       2014-12-20      created this file!
 *          2)
 */  
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

struct msg_packet_t {
	char    head;
	char    address;
	char    opcode;
	char    length;
	char    tail;
};

/* Who is 9527, I see you say :) */
#define    is_msg(msg) 	(((msg->head) == 95) && ((msg->tail) == 27)))

#define    is_42   do {        printf("The Answer to the Ultimate Question of Life,"    	"The Universe and Everything is 42\n");    }while(0)

#define    INIT_MSG_PACKET(msg)    {        .head    =  95,        .address =  00,        .opcode  =  01,        .length  =  00,        .tail    =  27,    }

#define msg_info(msg)    do    {        printf("\t %s.          \n"	   "\t head      :%d\n"	   "\t address   :%d\n"	   "\t opcode    :%d\n"	   "\t length    :%d\n"	   "\t tail      :%d\n"		    ,    		    __FUNCTION__,	   ((struct msg_packet_t*)msg)->head   ,	   ((struct msg_packet_t*)msg)->address,	   ((struct msg_packet_t*)msg)->opcode ,	   ((struct msg_packet_t*)msg)->length ,	   ((struct msg_packet_t*)msg)->tail    	  );    }while(0)

struct msg_packet_t    g_pool  =  INIT_MSG_PACKET(g_pool);
pthread_cond_t         had_tx  =  PTHREAD_COND_INITIALIZER;
pthread_mutex_t        lock    =  PTHREAS_MUTEX_INITIALIZER;

char msg_pack(char opcode);
char msg_unpack(struct msg_packet *msg);
void phy_tx(void* buff);
void phy_rx(void* buff);

void *thread_rx (void* buff)
{
	struct msg_packet_t msg;

	pthread_mutex_lock(lock);
	printf("\n\t wait msg\n");
	pthread_cond_wait(&had_tx, &lock);
	msg_unpack(&msg);
	msg_info(&msg);
	pthread_mutex_unlock(&lock);
	sleep(rand()%1);
}

void *thread_tx (void *buff)
{
	struct msg_packet_t msg;

	while(1) {
		msg.opcode    =  rand()%43;
		pthread_mutex_lock(&lock);
		msg_pack(msg.opcode);
		pthread_mutex_unlock(&lock);
		pthread_cond_signal(&had_tx);
		printf(msg tx !\n);
		sleep(rand()%10);
	}
}

int main(int argc, char *argv[])
{
	pthread_t  tid_tx;
	pthread_t  tid_rx;

	srand(time(NULL));

	pthread_create(&tid_tx, NULL, thread_tx, NULL);
	pthread_create(&tid_rx, NULL, thread_rx, NULL);

	pthread_join(tid_tx, NULL);
	pthread_join(tid_rx, NULL);

	exit(0);
}

char msg_unpack(struct msg_packet_t* msg)
{
	phy_rx(msg);

	if(!is_msg(msg)) {
		return;
	}

	switch(msg->opcode)
	{
		case 42:
		    is_42;
		    break;
		default:
		    break;
	}
}

char msg_pack(char opcode) {
	struct msg_packet_t* ptr = &g_pool;

	ptr->opcode = opcode;
	phy_tx(&g_pool);
}

void phy_tx(void* buff)
{
	g_pool = *(struct msg_packet_t*)buff;
	//phy tx
}

void phy_rx(void* buff)
{
	//phy rx
	*(struct msg_packet_t*)buff = g_pool;
}

时间: 2024-08-08 01:27:22

协议:如何实现一个最简单的通信协议(线程模拟)的相关文章

协议实现:如何实现一个最简单的通信协议(线程模拟)

/*  *Author  : DavidLin       *Date    : 2014-12-20pm       *Email   : [email protected] or [email protected]       *world   : the city of SZ, in China       *Ver     : 000.000.001       *For     : threads for rxtx!    *history :     editor      time

一个简单的通信协议(点对多点,灵活组队)(转)

源:一个简单的通信协议(点对多点,灵活组队) 用2430最诱人的地方应该还是ZigBee,但是有时候用ZigBee就像用宰牛刀杀鸡样,根本就没有那个必要,而且用ZigBee会降低实时性.用一般的时分多址(TDMA)就会显得简单而高效. 自己写的协议,应该是类于星状网的通信协议吧,所以下面的叙述的时候依然以网络来描述它. 这个网络的特征是由一个RX节点和1-250TX结点,RX结点类于ZigBee的网关吧,它要负责组网.维护和信息采集.而TX受控于RX,并且只能与一个RX通信,不能和别邻近RX通信

Node教程-HTTP协议,开发一个简单的静态网站

明确目标: 我们要开发一个静态的网站,下面就是它的网站首页 四.做一些开发前的知识储备 重要!:在js中的事件监听一般都是这样的格式 obj.on(event,callback) 表示的意思是:我们的对象正在监听event事件的发生,一旦发生了 我们有一个处理函数(回调函数callback)去处理它 (一). 有关于服务器嗨哟客户端之间的通信 这个非常的重要,你要知道所有的app之间是要建立起通信的,要不然你只是一个单机的版本,这就没什么意思了,只有联网,才能让你的应用更加的出色 开发网站服务器

Hello,Cardboard!!-如何开发一个最简单的Cardboard虚拟现实应用(一)

温馨提醒,本篇为介绍篇,如果只想看如何开发的具体步骤请参看<Hello,Cardboard!!-如何开发一个最简单的Cardboard虚拟现实应用(三)> 前述:恕我啰嗦一下,主要照顾对cardboard不太了解的朋在,Cardboard是由Google公司的两位巴黎办公室的员工利用业余时间创作出来的作品,它最大的特点就是将原来人们以为高大上的虚拟现实技术以廉价的方式带进了公众的视野,到目前为止,google已推出了改良版的cardboard 2代盒子,相比1代,2代改善了成像,增加了视野范围

http协议也是一个面向连接的协议

本文最初发表于chinaunix.net论坛之帖子<[其他] 您了解HTTP么?http://工作中奇葩HTTP问题经验大征集!>之回复. 差点来晚了,本人谈一下HTTP. 先回答这几个问题: 1.你了解 HTTP 吗? 了解. 2.你认为你真的很了解 HTTP 吗? 起码不是新手 3.你知道 HTTP/1.0 和 HTTP/1.1 的区别吗? http 1.0 和 1.1的最大区别就是HOST头,这个是用来实现虚\拟\主机的,也就是一个IP上,可以有多个网站,如果你的网站只是设置了通过HOS

Epii.js 一个极其简单的Js模板引擎

Epii.js 简约而不简单的JavaScript模板引擎 项目地址 https://github.com/epaii/epii.js 极低门槛,拿来即用,别忘记star 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑定和处理,不依赖任何第三方库,仅仅8k. 可快速应用于web开发,native+webapp开发,h5微网页开发,不与其它框架冲突. 让开发者更多关注与应用本身,而不用花费大量时间实现数据与ui的,和事件处理.效率大幅度提升. 名字由来

C#实现一个最简单的HTTP服务器

简介 本文用C#实现了一个最简单的HTTP服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于HTTP协议的知识. 背景 高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS, Apache, 和Tomcat.然而,HTML是非常灵活的UI标记语言,也就是说任何应用和后端服务都可以提供HTML的生成支持.在这个小小的例子中,像IIS,.Apache这样的服务器消耗的资源太大了,我们需要自己实现一个简单的HTTP服务器,将它嵌入到我们的应用中用来处理WEB请求.我们仅需要

【Java】一个最简单的事件总线实现

一个最简单的事件总线实现 MicroBus 使用 注册 class Receiver implements MicroBus.BusEventReceiver { public onCreate() { bus.register(this, String.class); } public onDestroy() { bus.unregister(this, String.class); } @Override public void onBusEvent(Object event) { if (

一个极为简单的requirejs实现

require和 sea的源码分析,我之前的博客有写过, 今天我想分享的是一个很简单的核心代码(不带注释和空行大概60行), 没有容错判断. require.js require函数实现用一句话概括: 依次加载require的模块,然后监测script的onload事件,判断所有模块加载成功,执行require的callback, 如果只带一个参数且不是数组,就是加载成功后return 模块. 1 //标记已经加载成功的个数 2 var REQ_TOTAL = 0; 3 //模块导出 4 win