怀疑zmq的IPC进程间通讯会像传统的命名管道一样,只能点对点通讯,或者ZMQ会像广播一样,server端的zmq_send会像广播一样,把数据都发送到connect到server端的client。故做如下实验:
1个Server端,2个client同时向发起server请求,server回复一个“proxy_reply:”+接收到数据组成的字符串。
server.c
//server.c
#include <stdio.h>
#include <zmq.h>
#include <pthread.h>
#include <string.h>
int main()
{
void *zeroReqpSock = NULL;
void *zeroReqpCtx = NULL;
int recv_size = 0;
int ret = -1;
char recv_buf[1024] = {0};
char send_buf[1024] = {0};
char *add_reply = "proxy_reply:";
zeroReqpCtx = zmq_ctx_new();
//创建socket
zeroReqpSock = zmq_socket(zeroReqpCtx, ZMQ_REP);
ret = zmq_bind(zeroReqpSock, "ipc:///tmp/feeds0");
if(ret < 0) {
printf("=== Bining IPC failed\n");
return 0;
}
while(1)
{
memset(recv_buf, 0, sizeof(recv_buf));
recv_size = zmq_recv (zeroReqpSock, recv_buf, 1024, 0);
printf("\n===size=%d\n",recv_size);
printf("=== recv_buf: %s\n", recv_buf);
if (recv_size > 0) {
memset(send_buf, 0, sizeof(send_buf));
memcpy(send_buf, add_reply, strlen(add_reply));
memcpy(send_buf+strlen(add_reply), recv_buf, sizeof(recv_buf));
printf("=== send_buf(%d):%s\n", strlen(send_buf), send_buf);
zmq_send(zeroReqpSock, send_buf, strlen(send_buf), 0);
}
sleep(2);
}
zmq_close(zeroReqpSock);
zmq_ctx_destroy(zeroReqpCtx);
}
client1.c
// client1.c
#include <zmq.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
int main(int argc, char *argv[])
{
void * zeroReqpCtx = NULL;
void * zeroReqpSock = NULL;
char recv_buf[1024] = {0};
char send_buf[1024] = "client1";
int ret = -1;
int recv_size = -1;
zeroReqpCtx = zmq_ctx_new();
//创建socket
zeroReqpSock = zmq_socket(zeroReqpCtx, ZMQ_REQ);
ret = zmq_connect(zeroReqpSock, "ipc:///tmp/feeds0");
if(ret < 0) {
printf("=== Connect IPC failed\n");
return 0;
}
while(1) {
printf("=== send_buf(%d):%s", strlen(send_buf), send_buf);
zmq_send(zeroReqpSock, send_buf, strlen(send_buf), 0);
memset(recv_buf, 0, sizeof(recv_buf));
recv_size = zmq_recv (zeroReqpSock, recv_buf, 1024, 0);
printf("\n===recv_size=%d\n",recv_size);
if (recv_size > 0) {
printf("=== recv_buf: %s\n", recv_buf);
}
}
zmq_close(zeroReqpSock);
zmq_ctx_destroy(zeroReqpCtx);
return 0;
}
client2.c
// client2.c
#include <zmq.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
int main(int argc, char *argv[])
{
void * zeroReqpCtx = NULL;
void * zeroReqpSock = NULL;
char recv_buf[1024] = {0};
char send_buf[1024] = "client2";
int ret = -1;
int recv_size = -1;
zeroReqpCtx = zmq_ctx_new();
//创建socket
zeroReqpSock = zmq_socket(zeroReqpCtx, ZMQ_REQ);
ret = zmq_connect(zeroReqpSock, "ipc:///tmp/feeds0");
if(ret < 0) {
printf("=== Connect IPC failed\n");
return 0;
}
while(1) {
printf("=== send_buf(%d):%s", strlen(send_buf), send_buf);
zmq_send(zeroReqpSock, send_buf, strlen(send_buf), 0);
memset(recv_buf, 0, sizeof(recv_buf));
recv_size = zmq_recv (zeroReqpSock, recv_buf, 1024, 0);
printf("\n===recv_size=%d\n",recv_size);
if (recv_size > 0) {
printf("=== recv_buf: %s\n", recv_buf);
}
}
zmq_close(zeroReqpSock);
zmq_ctx_destroy(zeroReqpCtx);
return 0;
}
执行效果如下:
server.c
client2.c
client1.c