11.23学习笔记_ZMQ

3 篇文章 0 订阅

今天开始专攻ZMQ的学习。

一大早理解两个简单的操作,zmq数据的发送和接收。ZMQ发送数据或接收数据实际上是一种格式的转换,即把C字符串转换成ZMQ字符串,或反之。

1、发送数据到套接字,即把C->ZMQ


//send message c->zmq

static char* s_send(void*socket,char *string)
{
    zmq_msg_t message;
    zmq_msg_inti_size(&message,strlen(string));
    memcpy(zmq_msg_data(&message),sting,strlen(sting));
    int size=zmq_msg_send(&message,socket,0);
    zmq_msg_close(&message);
    return (size);
}

2、从套接字接收数据,即ZMQ->C


//从套接字接收zmq字符串并转换成C字符串 zmq->c
static char* s_recv(void *socket)
{
    zmq_msg_t message;//create message
    zmq_msg_inti(&message);//read message and cteate an empty message,intialize.
    int size=zmq_msg_recv(&message,socket,0);//and then transfer it to recv.what is the return ?
    if(size==-1)
        return NULL;
    char *string=malloc(size+1);
    memcpy(string,zmq_msg_data(&message),size);
    zmq_msg_close(&message);
    string[size]=0;
    return (sting);
}

2、参考书中的案例实现了最简单的请求模式 完成服务器和客户机的helloworld程序。

发现了一个捷径,书中的案例获取数据和发送数据使用的是zmq_msg_recv()和zmq_msg_send()来写的,感觉略麻烦,直接用zmq_send()和zmq_recv()会更简单些,目前还不知道msg是在什么情况下使用,后期如果弄懂,回来补充。

附上代码

hwserver.c

#include<stdio.h>
#include<zmq.h>
#include<unistd.h>
#include<string.h>
#include <assert.h>
int main(void)
{
void *context=zmq_ctx_new();
void *ma=zmq_socket(context,ZMQ_REP);//服务器ma
zmq_bind(ma,"tcp://*:5555");
 while(1)
{
   // 第一种方法
   /*
     zmq_msg_t lu; //数据,lu接收,zmq->c
     zmq_msg_init(&lu);
     zmq_msg_recv(&lu,ma,0);
     printf("recv hello\n");
     zmq_msg_close(&lu);
     #endif
 

    
    sleep(1);
    
     zmq_msg_t miao;//数据,miao发送,c->ZMQ
     zmq_msg_init_size(&miao,5);
     memcpy(zmq_msg_data(&miao),"world",5);
     zmq_msg_send(&miao,ma,0);
     zmq_msg_close(&miao);
 */
     //第二种方法,比较简单
     char buffer[10]={0};
     zmq_recv(ma,buffer,10,0);
     printf("received msg :%s\n",buffer);
     printf("send the msg world\n\n");
     zmq_send(ma,"world",5,0);
 }
  zmq_close(ma);
  zmq_ctx_destroy(context);
  return 0;
}

hwclient.c

#include<stdio.h>
#include<unistd.h>
#include<zmq.h>
#include<string.h>
int main(void)
{
    void *context=zmq_ctx_new();
    printf("I want to connect to the server\n");
    void *ne=zmq_socket(context,ZMQ_REQ);
    zmq_connect(ne,"tcp://localhost:5555");
    
    //第一种方法,用msg发送,比较麻烦
    /*
    zmq_msg_t ting;//数据ting发送
    zmq_msg_init_size(&ting,5);
    memcpy(zmq_msg_data(&ting),"hello",5);
//    char *string;
    //memcpy(string,zmq_msg_data(&string),5);
//    printf("senting to the server na %s",string);
  printf("senting to the server na ");
    zmq_msg_send(&ting,ne,0);
    zmq_msg_close(&ting);
    //
    zmq_msg_t chi;
    zmq_msg_init(&chi);
    zmq_msg_recv(&chi,ne,0);
//    memcpy(zmq_msg_data(&chi),string,5);
//    printf("receive %s from the server",string);
  printf("receive world from the server");
  zmq_msg_close(&chi);
  */
  //第二种方法比较简单,可行。直接调用zmq_send()
  zmq_send(ne,"hello",5,0);
  char buffer[10]={0};
  zmq_recv(ne,buffer,10,0);
  printf(" recv the msg from the server: %s\n",buffer);
  //printf("Error:%s\n", zmq_strerror(errno));测试语句,资源暂不可用。
 
    
    
    //
    sleep(2);
    zmq_close(ne);
    zmq_ctx_destroy(context);
    return 0;
    
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值