easymc是一个C语言开发的简易的消息通道库,目前提供请求/回应、订阅/发布两种通信模式,同机器的通信采取IPC方式,跨机的通信采取TCP方式,源码包含开源项目jemalloc库。

代码地址:https://github.com/easymc/easymc

local端使用例子:

struct para{

int device;

int exit;

};

static emc_result_t EMC_CALL OnRecvMsg(void *p){

void *msg=NULL;

struct para *pa=(struct para *)p;

int device=pa->device;

while(!pa->exit){

if(0==emc_recv(device,(void **)&msg)){

//            printf("recv length=%ld\n",emc_msg_length(msg));

if(EMC_SUB==emc_msg_get_mode(msg)){

emc_msg_set_mode(msg,EMC_PUB);

}else if(EMC_REQ==emc_msg_get_mode(msg)){

emc_msg_set_mode(msg,EMC_REP);

}

emc_send(device,msg,0);

emc_msg_free(msg);

}

}

printf("OnRecvMsg exit\n");

return 0;

}

static emc_result_t EMC_CALL OnMonitorDevice(void *p){

struct para *pa=(struct para *)p;

int device=pa->device;

struct monitor_data data={0};

while(!pa->exit){

if(0==emc_monitor(device,&data)){

switch(data.events){

case EMC_EVENT_ACCEPT:

printf("client connected server,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

case EMC_EVENT_CLOSED:

printf("client disconnected server,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

case EMC_EVENT_SNDSUCC:

//                printf("server send successful,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

case EMC_EVENT_SNDFAIL:

//                printf("server send failed,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

}

}

}

return 0;

}

int main(int argc, char* argv[]){

struct para pa={0};

int monitor=1,ch=0;

int device=emc_device();

pa.device=device;

pa.exit=0;

emc_set(device,EMC_OPT_MONITOR|EMC_OPT_CONTROL,&monitor,sizeof(int));

printf("Input a port to bind:");

scanf("%ld",&ch);

if(emc_bind(device,NULL,ch) < 0){

printf("emc_bing fail\n");

}

emc_thread(OnRecvMsg,(void *)&pa);

emc_thread(OnMonitorDevice,(void *)&pa);

printf("Input C or c to close a connection,Q or q to exit\n");

while(1){

ch=getchar();

if('C'==ch || 'c'==ch){

printf("Input connection id:");

scanf("%ld",&ch);

emc_control(device,ch,EMC_CTL_CLOSE);

}else if('Q'==ch || 'q'==ch){

break;

}

}

getchar();

getchar();

pa.exit=1;

emc_destory(device);

getchar();

return 0;

}

remote端使用例子:

struct para{

int device;

int exit;

};

static emc_result_t EMC_CALL OnRecvMsg(void *p){

struct para *pa=(struct para *)p;

int device=pa->device;

void *msg=NULL;

while(!pa->exit){

if(0==emc_recv(device,(void **)&msg)){

printf("recv length=%ld\n",emc_msg_length(msg));

emc_msg_free(msg);

}

}

return 0;

}

static emc_result_t EMC_CALL OnMonitorDevice(void *p){

struct para *pa=(struct para *)p;

int device=pa->device;

struct monitor_data data={0};

while(!pa->exit){

if(0==emc_monitor(device,&data)){

switch(data.events){

case EMC_EVENT_CONNECT:

printf("client connected server,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

case EMC_EVENT_CLOSED:

printf("client disconnected server,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

case EMC_EVENT_SNDSUCC:

printf("server send successful,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

case EMC_EVENT_SNDFAIL:

printf("server send failed,ip=%s,port=%ld,id=%ld\n",data.ip,data.port,data.id);

break;

}

}

}

return 0;

}

int main(int argc, char* argv[]){

int ch=0;int device=-1;

char ip[16]={0};

int monitor=1,length=0,port=0;

void *msg=NULL;void *msg_=NULL;

struct para pa={0};

device=emc_device();

pa.device=device;

pa.exit=0;

printf("Input serve ip:");

scanf("%s",ip);

printf("Input server port:");

scanf("%ld",&port);

emc_thread(OnMonitorDevice,(void *)&pa);

emc_set(device,EMC_OPT_MONITOR,&monitor,sizeof(int));

printf("Input mode(1-req,8-sub):");

scanf("%ld",&ch);

emc_connect(device,ch,ip,port);

emc_thread(OnRecvMsg,(void *)&pa);

printf("Input send data length[Bytes]:");

scanf("%ld",&length);

if(EMC_REQ==ch){

printf("You choose REQREP mode,type S or s to send data and type Q or q to quit\n");

while(1){

ch=getchar();

if('S'==ch || 's'==ch){

msg=emc_msg_alloc(NULL,length);

emc_msg_set_mode(msg,EMC_REQ);

emc_send(device,msg,0);

emc_msg_free(msg);

}else if('Q'==ch || 'q'==ch){

pa.exit=1;

break;

}

}

}else if(EMC_SUB==ch){

printf("You choose PUBSUB mode,type S or s to send data and type Q or q to quit\n");

while(1){

ch=getchar();

if('S'==ch || 's'==ch){

msg=emc_msg_alloc(NULL,length);

emc_msg_set_mode(msg,EMC_SUB);

emc_send(device,msg,0);

emc_msg_free(msg);

}else if('Q'==ch || 'q'==ch){

pa.exit=1;

break;

}

}

}

getchar();

getchar();

pa.exit=1;

emc_destory(device);

return 0;

}

c语言mc协议,easymc - C语言开发的简易消息通道库相关推荐

  1. c语言mc协议,三菱PLC MC协议的配置和使用简析

    1.三菱MC协议的目的 MC协议的目的是开放PLC内部寄存器给外部设备,实现外部设备和PLC的数据交互.简单说就是允许外部设备通过MC协议来读/写PLC里面的寄存器 2. 通信协议方式 通讯方式有48 ...

  2. Visual Studio的语言服务器协议

    语言服务器协议(LSP)是Visual Studio Code的一个重要组件.语言服务器实际上是单独运行的编译器或分析器,它负责处理各种任务,如编译器错误报告.文本悬浮.代码自动完成(也就是Intel ...

  3. 服务器云ide_语言服务器协议如何影响IDE的未来

    服务器云ide The release of Visual Studio Code single-handedly impacted the developer ecosystem in such a ...

  4. 六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享

    六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享 六款小巧的HTTP Server[C语言] keminar 发表于 2010-02-05 23:14:41. 发 ...

  5. python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程

    本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...

  6. 前端H5怎么切换语言_H5前端和移动APP开发知识点和配套视频

    随着互联网.移动互联网的发展,HTML5成为了客户端软件开发的主流技术,HTML5实际上是由:HTML5语言.CSS3.JAVASCRIPT语言组成. 尚学堂的HTML5前端课程由国内知名技术专家刘兴 ...

  7. java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]

    本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...

  8. php和c语言那个竞争大,【后端开发】php和c语言哪个难

    PHP是弱类型解释型语言,对类型不敏感,入门简单,基础知识很快就能学习好:C是典型的强类型语言,变量类型,无法被随意更改,所以难度较php稍大些. PHP(外文名:PHP: Hypertext Pre ...

  9. 单片机学c语言还是python好_单片机开发用哪种语言最好?

    在过去的几十年中,单片机的规格变化不大,但是语言和支持软件的扩展为应用程序开发开辟了许多途径.多年来,对单片机进行编程涉及到两种语言的选择:C语言和汇编语言.但是随着现在可用于微处理器的新语言,用户在 ...

最新文章

  1. GetAsyncKeyState
  2. main函数与命令行参数
  3. 艾宾浩斯记忆表格excel_好的记忆方法是一切学习的关键(艾宾浩斯记忆法)
  4. (转载)C#:Enum、Int和String的互相转换,枚举转换
  5. python —— 装饰器
  6. 51nod1220-约数之和【莫比乌斯反演,杜教筛】
  7. 【Leetcode】113. 路径总和 II
  8. iar 连接linux开发板,LED裸机程序(IAR)
  9. mysql 名次语法规则_基于sql语句的一些常用语法积累总结
  10. Google Earth Engine ——消除影像色差直方图匹配算法(CDF累计分布函数)!
  11. 为Android购买多个改装微信,从制作一个“微信多开版”看微信安全
  12. pmp考试中变更的处理流程
  13. excel 置信区间 计算_Excel 计算置信区间:CONFIDENCE函数详解
  14. 应用电路笔记(1)-三极管8550和8050应用
  15. 一个可以为你的任何创作加速的神软件
  16. Ordered Fractions
  17. HashMap为什么用链表加红黑树?目的是什么?原理是什么
  18. BMR的计算(Python)
  19. 安装Oracle Instant Client
  20. 阿里云不为人知的 B 面

热门文章

  1. Docker+Jenkins+Git+GitLab实现DevOps
  2. 项目集成Spring Security
  3. Android studio 修改gradle版本
  4. windows安装nvm
  5. 用户画像标签维度_一文看懂用户画像标签体系(包括维度、应用场景)
  6. 基于java的程序启动出错Could not create the Java virtual machine
  7. mysql中新建不了查询语句_将excel和mysql建立链接后,如何通过在excel里面执行mysql查询语句,然后建立查询...
  8. 屏幕输出语句_C语言快速入门——表达式与语句
  9. 四、Dynamic-programming algorithm Dynamic--LCS
  10. 部署gogs_可以更快地查阅 Gogs 文档了!