【发布时间】:2021-03-29 16:41:48
【问题描述】:
我一直在尝试通过构建一个名为 SwiftyZeroMQ 的现有包装器来为 Swift 编写一个 libzmq 包装器。但是,出于我们的目的,我们需要使用原始 UDP,这意味着我们需要使用 ZeroMQ 的Radio/Dish draft method。
我已经能够成功地编写一个用于通过 Dish 套接字接收数据的包装器,但我现在正在尝试编写一个用于通过 Radio 套接字发送数据的包装器。网上似乎没有任何关于如何编写函数以通过 Radio 套接字发送数据的内容,但我确实遇到了this。 libzmq repo 中的这个函数测试通过无线电套接字发送数据,所以我想为什么不尝试在 Swift 中复制这个函数。
这是我想出的:
Socket.swift 文件内:
public func sendRadioMessage(_ group: String, data: NSData) throws{
var msg = zmq_msg_t.init();
var result : Int32;
let flags: SocketSendRecvOption = .none
result = zmq_msg_init(&msg);
if (result == -1) { throw ZeroMQError.last }
defer {
// Clean up message on scope exit
zmq_msg_close(&msg)
}
print("initial msg data = \(zmq_msg_data(&msg))")
print("initial data = \(data)")
memcpy(zmq_msg_data(&msg), (data as NSData).bytes, data.length);
print("msg size = \(zmq_msg_size(&msg))")
print("msg = \(zmq_msg_data(&msg))")
result = zmq_msg_set_group(&msg, group);
if (result == -1) { throw ZeroMQError.last }
result = zmq_msg_send(&msg, self.handle, flags.rawValue);
if (result == -1) { throw ZeroMQError.last }
print("sent \(result) bytes")
}
}
然后像这样调用该函数:
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 函数吗?我有点卡住了。
【问题讨论】:
-
这段代码不是C++
-
@PaulMcKenzie 我使用的库有一个 C++ 核心,我与之交互的函数也是用 C++ 编写的。我链接的示例函数也是用 C++ 编写的。我的代码基于那个 C++ 函数。
-
那么应该很容易看出memcpy需要什么作为参数。
-
@PaulMcKenzie 是的,我已经查看了 memcpy 函数参数。我传递的参数与它在您的链接上的状态相关。
-
memcpy没有任何问题。它只知道去源地址并将字节复制到目标地址——不多也不少。 memcpy 不关心参数,不检查它们的有效性等。它会盲目地接受你给它的东西,把它解释为地址,然后复制。传递正确的论点是你的责任。对于任何基于 C++ 的函数,您都会遇到同样的问题,而不仅仅是memcpy。
标签: c++ objective-c swift zeromq memcpy