gpt4 book ai didi

c++ - 如何将 Windows SOCKADDR_BTH 的 C++ 转换复制到 Rust 中的 SOCKADDR?

转载 作者:太空狗 更新时间:2023-10-29 20:52:14 24 4
gpt4 key购买 nike

我正在用 Rust 在 Windows 上编写一个蓝牙实用程序,使用 winsock2(但很乐意使用任何其他库)并且遇到了障碍。以下 C++ 示例来自 Windows Bluetooth Connection Sample是我用作引用的内容:。

SOCKADDR_BTH SockAddrBthServer;
# code to set SockAddrBthServer vals in here
connect(LocalSocket, (struct sockaddr *) &SockAddrBthServer, sizeof(SOCKADDR_BTH));

结构体定义如下:

typedef struct _SOCKADDR_BTH
{
USHORT addressFamily; // Always AF_BTH
BTH_ADDR btAddr; // Bluetooth device address
GUID serviceClassId; // [OPTIONAL] system will query SDP for port
ULONG port; // RFCOMM channel or L2CAP PSM
} SOCKADDR_BTH, *PSOCKADDR_BTH;


typedef struct sockaddr {

#if (_WIN32_WINNT < 0x0600)
u_short sa_family;
#else
ADDRESS_FAMILY sa_family; // Address family.
#endif //(_WIN32_WINNT < 0x0600)

CHAR sa_data[14]; // Up to 14 bytes of direct address.
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;

如何在 Rust 中从上面的连接线复制 (struct sockaddr *) &SockAddrBthServer ?到目前为止,我正在使用 winapi、user32 和 ws2_32 crate。

这是 connect function from the ws2_32 crate 的 Rust 版本.

pub unsafe extern "system" fn connect(s: SOCKET, name: *const SOCKADDR, namelen: c_int) -> c_int

最佳答案

你想多了。如果 Windows 认为将 SOCKADDR_BTH 指针转换为 SOCKADDR 指针很酷,那么就这样做吧。在 Rust 中,您必须添加一个额外的转换以离开引用的安全世界并获得原始指针,然后您可以将其转换为任何您想要的:

use std::mem;

struct SomeErrorType;

fn example(LocalSocket: SOCKET) -> Result<SOCKADDR_BTH, SomeErrorType> {
unsafe {
let SockAddrBthServer: SOCKADDR_BTH = mem::uninitialized();
let retval = connect(
LocalSocket,
&SockAddrBthServer as *const SOCKADDR_BTH as *const SOCKADDR,
mem::size_of::<SOCKADDR_BTH>() as i32,
);
// PERFORM REAL ERROR CHECKING HERE
if retval == 42 {
Ok(SockAddrBthServer)
} else {
Err(SomeErrorType)
}
}
}

(未经测试,因为我手边没有 Windows 机器)

在幕后,这仅在 SOCKADDR_BTH 的初始成员与 SOCKADDR 的成员完全匹配时才有效。

关于c++ - 如何将 Windows SOCKADDR_BTH 的 C++ 转换复制到 Rust 中的 SOCKADDR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46562030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com