C++ Swift memcpy没有';与ZMQ ZMQ_msg_数据一起使用时不会产生任何影响

C++ Swift memcpy没有';与ZMQ ZMQ_msg_数据一起使用时不会产生任何影响,c++,objective-c,swift,zeromq,memcpy,C++,Objective C,Swift,Zeromq,Memcpy,我一直在尝试通过构建一个名为libzmq的现有包装来为Swift编写libzmq包装。然而,出于我们的目的,我们需要使用原始UDP,这意味着我们需要使用ZeroMQ 我已经能够成功地编写一个通过Dish套接字接收数据的包装器,但现在我正在尝试编写一个通过Radio套接字发送数据的包装器。网上似乎没有任何关于如何编写函数通过无线电插座发送数据的东西,但我确实遇到过。libzmq repo中的这个函数测试通过无线电套接字发送数据,所以我想为什么不尝试在Swift中复制这个函数呢 以下是我的想法: 在

我一直在尝试通过构建一个名为libzmq的现有包装来为Swift编写libzmq包装。然而,出于我们的目的,我们需要使用原始UDP,这意味着我们需要使用ZeroMQ

我已经能够成功地编写一个通过Dish套接字接收数据的包装器,但现在我正在尝试编写一个通过Radio套接字发送数据的包装器。网上似乎没有任何关于如何编写函数通过无线电插座发送数据的东西,但我确实遇到过。libzmq repo中的这个函数测试通过无线电套接字发送数据,所以我想为什么不尝试在Swift中复制这个函数呢

以下是我的想法:

在文件中:

该函数的调用方式如下:

    public func send(data: String) -> Bool{
        do{
            try radio?.sendRadioMessage(group, data: data.data(using: .utf8) as! NSData);
        }
        catch{
            print("SEND COMMUNICATION error - \(error)");
            return false;
        }
        return true;
    }

   obj.send(data: "Test Data")
这是运行程序时的控制台输出:

在我看来,我从Swift调用的
memcpy
函数实际上似乎什么都没有做。这是不是因为我没有将数据有效负载正确地传递给
memcpy
函数?我有点卡住了。

API文档化的
zmq\u msg\u data()
函数可以从传递的ZeroMQ消息中“读取”数据部分

使用上下文和参数顺序:

void* memcpy(        void* dest,
               const void* src,
              std::size_t  count
              );
显示您的代码试图将数据“存储”到
zmq_msg_t
-实例中,尽管ZeroMQ API文档中多次警告不要尝试“触摸”,但通过使用成员函数“直接”操作数据的次数越少:

切勿直接访问
zmq\u msg\u t
成员,而应始终使用
zmq\u msg
函数系列。

此处,可能使用:

另请注意,提议的辩护:

result = zmq_msg_init( &msg );
if ...
确实在v2.x和v3.x中有一定的意义,但在进入v4.x之后,它开始无所作为,正如ZeroMQ v4.3+API中所保持的那样,以适当的形式和形式记录:

返回值

zmq\u msg\u init()
函数始终返回零


需要一些版本控制和重新设计的努力,以便在端口版本和实际API版本之间保持一致。

此代码不是C++ + PaulMcKeZiIe。我使用的库中有一个C++核心,我正在与之交互的函数也用C++编写。我连接的示例函数也用C++编写。我把我的代码放在C++函数的基础上。然后很容易看到什么需要作为参数。@ PulcMcKeZie:是的,我已经查看了MimcPy函数参数。我传递的参数与链接上的状态相关。
memcpy
没有问题。它只知道转到源地址并将字节复制到目标地址——不多也不少。memcpy不关心参数,不检查它们的有效性,等等。它会盲目地接受您提供的内容,将其解释为地址,并制作副本。你有责任传递正确的论点。对于任何有C++地址的函数,你都会遇到同样的问题,而不仅仅是代码> MeMCPY < /C>。这确实解决了消息中没有任何数据的问题,但是它不能解决我的总体目标。我的python程序没有收到任何消息。我认为这是因为在dish端(我的python程序),它试图通过只使用receive函数而不使用消息来接收数据。你知道我如何不用短信发送数据吗?很高兴它对@RichardWei有帮助
int zmq_msg_init_data (   zmq_msg_t *msg, 
                               void *data, // <------- payload to load into *msg
                             size_t  size,
                        zmq_free_fn *ffn,  // ref. API details
                               void *hint  //          on this
                        );
//
// Initialising a message from a supplied buffer
//
// *********************************************

void my_free ( void *data, void *hint ) // ------- a dealloc helper
{
    free ( data );
}

/* ... */

void *data = malloc ( 6 ); // -------------------- a mock-up payload data
assert ( data );
memcpy ( data, "ABCDEF", 6 );

zmq_msg_t msg;
rc = zmq_msg_init_data ( &msg, data, 6, my_free, NULL );
assert (   rc == 0
       && "INF: zmq_msg_init_data() failed, saying"
       &&  zmq_strerror ( zmq_errno() ) // ------- a non-POSIX system workaround
           );
result = zmq_msg_init( &msg );
if ...