zeroMQ支持PGM协议编译

vs2019编译

1.下载openPGM

    链接:https://github.com/steve-o/openpgm

    编译虽然过了但是,拿zmq epgm测试时直接报错abort参数无效。简单说就是

拿vs2019编译的openpgm,虽然编译过了,但是使用zmq epgm测试,直接abort。折腾半天发现是setsockopt使用参数级别宏SOL_IP问题,必须使用IPPROTO_IP设置,要不报参数无效。我发现vs2015中ws2def.h没有SOL_IP定义。按理IPPROTO_IP == SOL_IP,但是vs2019 ws2def.h中值不一样。详情https://github.com/zeromq/libzmq/issues/4301。

2.下载zeroMQ源码

    链接:Release libzmq 4.3.4 · zeromq/libzmq · GitHub

3.cmake编译

   cmake-gui打开cmake文件,勾选WithOpenPGM.选择编译动态库,静态库比较麻烦

4.打开工程编译

      编译后产生.lib.dll文件

5.建立测试工程测试

附:

1.已经修改openpgm中源码使用IPPROTO_IP。静态链接到libzmq。

自己编译好的 https://download.csdn.net/download/choujayyl/42438886

2.python测试例子

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("epgm://192.168.0.15;224.0.22.1:9210")
socket.setsockopt(zmq.SUBSCRIBE, b'')
while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    #  Do some 'work'
    #time.sleep(1)

    #  Send reply back to client
    #socket.send(b"World")

3.C测试例子接收端

//
// Created by choujayyl on 2021/11/15.
//

#include <string.h>
#include <windows.h>
#include <zmq.h>
int main()
{
    int index = 0;
    int count = -1;
    char buf[128000];
    //上下文
    void* context = zmq_ctx_new();
    //服务器指定为发布者
    void* socket = zmq_socket(context, ZMQ_SUB);
    //连接组播地址, epgm协议写法官网上有详细说明, 这里不指定网络接口, 使用默认
    zmq_setsockopt(socket, ZMQ_SUBSCRIBE, "", 0);

    int rc = zmq_connect(socket, "epgm://192.168.0.15;224.0.22.1:9210");
    if (rc != 0)
    {

        printf("zmq_errno() is %d,:%s\n", zmq_errno(), zmq_strerror(zmq_errno()));
        return -1;
    }

    while (1) {
        count = zmq_recv(socket, buf, sizeof(buf), 0);
        if (count > 0)
        {
            printf("RECV: %d\r\n", count);
        }
        else
        {
            printf("ERROR: %d\r\n", count);
        }
    }

    zmq_close(socket);
    zmq_ctx_destroy(context);
    return 0;
}

 4.C发送端例子

// testEPGM.cpp : 定义控制台应用程序的入口点。
//

#include <zmq.h>
#include <Windows.h>
int main()
{
	int index = 0;
	int count = -1;
	char buf[12800];
	//上下文
	void* context = zmq_ctx_new();
	//服务器指定为发布者
	void* socket = zmq_socket(context, ZMQ_PUB);
	//连接组播地址, epgm协议写法官网上有详细说明, 这里不指定网络接口, 使用默认
	int rc = zmq_connect(socket, "epgm://192.168.0.6;224.0.22.1:9210");
	if (rc != 0)
	{

		printf("zmq_errno() is %d,:%s\n", zmq_errno(), zmq_strerror(zmq_errno()));
		return -1;
	}

	while (1) {
		sprintf_s(buf, sizeof(buf),"%d -- SERVER MSG!", index++);
		//发送消息
		count = zmq_send(socket, buf, sizeof(buf), 0);
		printf("%s (%d)\r\n", buf, count);
		Sleep(1000);
	}

	zmq_close(socket);
	zmq_ctx_destroy(context);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值