在 Swift 中初始化具有给定 IP 地址的 `sockaddr` 结构
Init a `sockaddr` struct with a given IP address in Swift
我在 Swift.
玩苹果的 Reachabilitty
class
我的私人 Wi-Fi 网络服务器在 http://10.0.0.1
上运行。要检查其可达性,我想使用 Reachability.h
中的以下函数(不是带有主机名的函数):
/*!
* Use to check the reachability of a given IP address.
*/
+ (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress;
我 sockaddr
看起来像 socket.h
这样的:
/*
* [XSI] Structure used by kernel to store most addresses.
*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
如何在 Swift 中创建具有 IP 地址 10.0.0.1
的 sockaddr
结构?
我已经阅读了 [here] 一些关于 UnsafePointer
和 UnsafeMutablePointer
的内容,并且表示了 C 数组(或者在这种情况下是 Objective-C 数组?)作为 Swift 中的元组,但我仍然不确定如何使用它们。
你先创建一个sockaddr_in
:
var addr = sockaddr_in()
addr.sin_len = UInt8(MemoryLayout.size(ofValue: addr))
addr.sin_family = sa_family_t(AF_INET)
addr.sin_addr.s_addr = inet_addr("10.0.0.1")
// Alternatively:
inet_pton(AF_INET, "10.0.0.1", &addr.sin_addr)
然后 "rebind" 指向 sockaddr
指针,例如
let reachability = withUnsafePointer(to: &addr, {
[=11=].withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, [=11=])
}
})
一些解释:
不同的地址族有不同的地址类型(如struct sockaddr_in
代表IPv4,struct sockaddr_in6
代表IPv6)。 struct sockaddr
是“公共部分”,许多套接字函数将指向 sockaddr
的指针作为参数。
在 C 中,您可以简单地在指针之间转换:
struct sockaddr sin;
// ...
struct sockaddr *addrPtr = (struct sockaddr *)&sin;
在 Swift 中更明确地表示为“重新绑定”。
有关详细信息,请参阅
我在 Swift.
玩苹果的Reachabilitty
class
我的私人 Wi-Fi 网络服务器在 http://10.0.0.1
上运行。要检查其可达性,我想使用 Reachability.h
中的以下函数(不是带有主机名的函数):
/*!
* Use to check the reachability of a given IP address.
*/
+ (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress;
我 sockaddr
看起来像 socket.h
这样的:
/*
* [XSI] Structure used by kernel to store most addresses.
*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
如何在 Swift 中创建具有 IP 地址 10.0.0.1
的 sockaddr
结构?
我已经阅读了 [here] 一些关于 UnsafePointer
和 UnsafeMutablePointer
的内容,并且表示了 C 数组(或者在这种情况下是 Objective-C 数组?)作为 Swift 中的元组,但我仍然不确定如何使用它们。
你先创建一个sockaddr_in
:
var addr = sockaddr_in()
addr.sin_len = UInt8(MemoryLayout.size(ofValue: addr))
addr.sin_family = sa_family_t(AF_INET)
addr.sin_addr.s_addr = inet_addr("10.0.0.1")
// Alternatively:
inet_pton(AF_INET, "10.0.0.1", &addr.sin_addr)
然后 "rebind" 指向 sockaddr
指针,例如
let reachability = withUnsafePointer(to: &addr, {
[=11=].withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, [=11=])
}
})
一些解释:
不同的地址族有不同的地址类型(如struct sockaddr_in
代表IPv4,struct sockaddr_in6
代表IPv6)。 struct sockaddr
是“公共部分”,许多套接字函数将指向 sockaddr
的指针作为参数。
在 C 中,您可以简单地在指针之间转换:
struct sockaddr sin;
// ...
struct sockaddr *addrPtr = (struct sockaddr *)&sin;
在 Swift 中更明确地表示为“重新绑定”。 有关详细信息,请参阅