c语言easy,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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值