ios - 在 Swift 中使用给定的 IP 地址初始化一个 `sockaddr` 结构

标签 ios objective-c swift objective-c-swift-bridge

我在玩苹果的Reachabilitty Swift 中的类。

我的私有(private) Wi-Fi 中的 Web 服务器在 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.1sockaddr 结构?

我已经阅读了 [ here ] 关于 UnsafePointerUnsafeMutablePointer 以及 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)

然后将其“重新绑定(bind)”到 sockaddr 指针,例如

let reachability = withUnsafePointer(to: &addr, {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
        SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, $0)
    }
})

一些解释:

不同的地址族有不同的地址类型(如struct sockaddr_in用于IPv4,struct sockaddr_in6用于IPv6)。 struct sockaddr 是“公共(public)部分”,许多套接字函数将指向 sockaddr 的指针作为参数。

在 C 中,您可以简单地在指针之间转换:

struct sockaddr sin;
// ...
struct sockaddr *addrPtr = (struct sockaddr *)&sin;

在 Swift 中,这被更明确地称为“重新绑定(bind)”。 有关详细信息,请参阅

关于ios - 在 Swift 中使用给定的 IP 地址初始化一个 `sockaddr` 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49456231/

相关文章:

ios - 您如何调用/使用位于子项目中的 Storyboard

objective-c - objective-c 中是否有等效的 sqlite .dump?

ios - 垂直滚动 Collection View Inside Table View cell

iphone - 最后一个 UITableViewCell 上的 UITableViewScrollPositionTop

ios - iOS后台调优后单例实例的生命周期

ios - FIrebase 3 查询以返回与子键/值匹配的值

ios - NSOperationQueue swift 完成所有任务 3

iOS CLLocation 高度场 - 椭圆体还是大地水准面?

objective-c - 图像的像素数据

ios - 了解 aurioTouch2 中的 FFT