今天开始专攻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;
}