如何在 iPhone 上的 Swift 中实现 UDP 客户端和发送数据



我想开发UDP客户端并在Swift中发送数据。

我参考了以下链接:

Swift: Receive UDP with GCDAsyncUdpSocket

从 UDP 服务器消息中检索字符串

快速的UDP连接

但是我找不到在Swift中实施UDP的好方法。

有人可以教我如何在iPhone上的Swift中实现UDP客户端和发送数据吗?

对我来说

,我使用了这个,以及它的用法:

broadcastConnection = UDPBroadcastConnection(port: 35602) { [unowned self] (response: (ipAddress: String, port: Int, response: [UInt8])) -> Void in
    print("Received from (response.ipAddress):(response.port):nn(response.response)")
}

看起来像是Swift UDP连接的欺骗。

稍微重构一下示例:

let INADDR_ANY = in_addr(s_addr: 0)
udpSend("Hello World!", address: INADDR_ANY, port: 1337)
func udpSend(textToSend: String, address: in_addr, port: CUnsignedShort) {
  func htons(value: CUnsignedShort) -> CUnsignedShort {
    return (value << 8) + (value >> 8);
  }
  let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP
  var addr = sockaddr_in(
    sin_len:    __uint8_t(sizeof(sockaddr_in)),
    sin_family: sa_family_t(AF_INET),
    sin_port:   htons(port),
    sin_addr:   address,
    sin_zero:   ( 0, 0, 0, 0, 0, 0, 0, 0 )
  )
  textToSend.withCString { cstr -> Void in
    withUnsafePointer(&addr) { ptr -> Void in
      let addrptr = UnsafePointer<sockaddr>(ptr)
      sendto(fd, cstr, strlen(cstr), 0, addrptr, socklen_t(addr.sin_len))
    }
  }
  close(fd)
}

如果将目标 IP 作为字符串,请使用 inet_pton() 将其转换为in_addr。这样:

var addr = in_addr()
inet_pton(AF_INET, "192.168.0.1", &buf)

随意从这里窃取代码:SwiftSockets

哦,如果你打算做任何严肃的网络编程,请抓住这本书:Unix网络编程

非常好的样本!我的两分钱..修复了 SWIFT 4.2。/Xcode 10,(我喜欢使用20行而不是一堆其他文件..和Pods..)。添加了更多返回的结果。

import Foundation
func udpSend(textToSend: String, address: in_addr, port: CUnsignedShort) {

func htons(value: CUnsignedShort) -> CUnsignedShort {
    return (value << 8) + (value >> 8);
}
let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP
let addr = sockaddr_in(
    sin_len:    __uint8_t(MemoryLayout<sockaddr_in>.size),
    sin_family: sa_family_t(AF_INET),
    sin_port:   htons(value: port),
    sin_addr:   address,
    sin_zero:   ( 0, 0, 0, 0, 0, 0, 0, 0 )
)
let sent = textToSend.withCString { cstr -> Int in
    var localCopy = addr
    let sent = withUnsafePointer(to: &localCopy) { pointer -> Int in
        let memory = UnsafeRawPointer(pointer).bindMemory(to: sockaddr.self, capacity: 1)
        let sent = sendto(fd, cstr, strlen(cstr), 0, memory, socklen_t(addr.sin_len))
        return sent
    }
    return sent
}
close(fd)

}

经过相当广泛的研究,只提出了GCD的AsyncSocket的基本指针,并且作为一个纯粹的Swift训练有素的iOS程序员,我寻找了一些支持原生Swift套接字的东西。

值得庆幸的是,我找到了使用Async的更简单的替代方案,称为SwiftSocket。

github(https://github.com/xyyc/SwiftSocket)具有大多数套接字的示例,只需将几个文件复制到项目中即可使用。

对于仅限 swift 的开发人员,我觉得它没有得到充分利用,并将迅速取代非 objective-c 应用程序的 Async。再说一次,我对这个东西很陌生,所以我可能离:D

最新更新