c语言mc协议,easymc - C语言开发的简易消息通道库
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语言开发的简易消息通道库相关推荐
- c语言mc协议,三菱PLC MC协议的配置和使用简析
1.三菱MC协议的目的 MC协议的目的是开放PLC内部寄存器给外部设备,实现外部设备和PLC的数据交互.简单说就是允许外部设备通过MC协议来读/写PLC里面的寄存器 2. 通信协议方式 通讯方式有48 ...
- Visual Studio的语言服务器协议
语言服务器协议(LSP)是Visual Studio Code的一个重要组件.语言服务器实际上是单独运行的编译器或分析器,它负责处理各种任务,如编译器错误报告.文本悬浮.代码自动完成(也就是Intel ...
- 服务器云ide_语言服务器协议如何影响IDE的未来
服务器云ide The release of Visual Studio Code single-handedly impacted the developer ecosystem in such a ...
- 六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享
六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享 六款小巧的HTTP Server[C语言] keminar 发表于 2010-02-05 23:14:41. 发 ...
- python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程
本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...
- 前端H5怎么切换语言_H5前端和移动APP开发知识点和配套视频
随着互联网.移动互联网的发展,HTML5成为了客户端软件开发的主流技术,HTML5实际上是由:HTML5语言.CSS3.JAVASCRIPT语言组成. 尚学堂的HTML5前端课程由国内知名技术专家刘兴 ...
- java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]
本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...
- php和c语言那个竞争大,【后端开发】php和c语言哪个难
PHP是弱类型解释型语言,对类型不敏感,入门简单,基础知识很快就能学习好:C是典型的强类型语言,变量类型,无法被随意更改,所以难度较php稍大些. PHP(外文名:PHP: Hypertext Pre ...
- 单片机学c语言还是python好_单片机开发用哪种语言最好?
在过去的几十年中,单片机的规格变化不大,但是语言和支持软件的扩展为应用程序开发开辟了许多途径.多年来,对单片机进行编程涉及到两种语言的选择:C语言和汇编语言.但是随着现在可用于微处理器的新语言,用户在 ...
最新文章
- GetAsyncKeyState
- main函数与命令行参数
- 艾宾浩斯记忆表格excel_好的记忆方法是一切学习的关键(艾宾浩斯记忆法)
- (转载)C#:Enum、Int和String的互相转换,枚举转换
- python —— 装饰器
- 51nod1220-约数之和【莫比乌斯反演,杜教筛】
- 【Leetcode】113. 路径总和 II
- iar 连接linux开发板,LED裸机程序(IAR)
- mysql 名次语法规则_基于sql语句的一些常用语法积累总结
- Google Earth Engine ——消除影像色差直方图匹配算法(CDF累计分布函数)!
- 为Android购买多个改装微信,从制作一个“微信多开版”看微信安全
- pmp考试中变更的处理流程
- excel 置信区间 计算_Excel 计算置信区间:CONFIDENCE函数详解
- 应用电路笔记(1)-三极管8550和8050应用
- 一个可以为你的任何创作加速的神软件
- Ordered Fractions
- HashMap为什么用链表加红黑树?目的是什么?原理是什么
- BMR的计算(Python)
- 安装Oracle Instant Client
- 阿里云不为人知的 B 面
热门文章
- Docker+Jenkins+Git+GitLab实现DevOps
- 项目集成Spring Security
- Android studio 修改gradle版本
- windows安装nvm
- 用户画像标签维度_一文看懂用户画像标签体系(包括维度、应用场景)
- 基于java的程序启动出错Could not create the Java virtual machine
- mysql中新建不了查询语句_将excel和mysql建立链接后,如何通过在excel里面执行mysql查询语句,然后建立查询...
- 屏幕输出语句_C语言快速入门——表达式与语句
- 四、Dynamic-programming algorithm Dynamic--LCS
- 部署gogs_可以更快地查阅 Gogs 文档了!