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;
}