ZeroMQ-IPC的请求回复模式

该实验通过ZMQ的REP-REQ模式验证了进程间通讯不是广播行为,而是点对点通信。实验中,一个Server端接收到两个Client的请求,并依次回复带有接收到数据的响应。每个Client都能正确接收到来自Server的个性化回复,表明ZMQ的IPC通讯具备一对一交互特性。
摘要由CSDN通过智能技术生成

怀疑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

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酣楼驻海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值