简体   繁体   English

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

[英]How to implement UDP client and send data in Swift on iPhone?

I want to develop UDP client and send data in Swift. 我想开发UDP客户端并在Swift中发送数据。

I have reference the following link: 我参考了以下链接:

Swift: Receive UDP with GCDAsyncUdpSocket Swift:使用GCDAsyncUdpSocket接收UDP

Retrieving a string from a UDP server message 从UDP服务器消息中检索字符串

Swift UDP Connection Swift UDP连接

But I could not find a good way to implement UDP in Swift . 但我找不到在Swift实现UDP的好方法。

Can someone teach me How to implement UDP client and send data in Swift on iPhone? 有人可以教我如何实现UDP客户端并在iPhone上的Swift中发送数据?

for me, I used this , and its usage: 对我来说,我使用了 ,它的用法:

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

This looks like a dupe to Swift UDP Connection . 这看起来像是对Swift UDP Connection的欺骗。

Refactoring the example a little bit: 稍微重构一下这个例子:

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)
}

If you have the target IP as a string, use inet_pton() to convert it to an in_addr. 如果您将目标IP作为字符串,请使用inet_pton()将其转换为in_addr。 Like so: 像这样:

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

Feel free to steal code from over here: SwiftSockets 随意从这里窃取代码: SwiftSockets

Oh, and if you plan to do any serious network programming, grab this book: Unix Network Programming 哦,如果你打算做任何严肃的网络编程,请抓住这本书: Unix网络编程

After pretty extensive research coming up with only basic pointers towards GCD's AsyncSocket, and being a pure Swift trained iOS programmer, I looked for something with native Swift socket support. 经过相当广泛的研究,只提出了对GCD的AsyncSocket的基本指示,并且是一个纯粹的Swift训练的iOS程序员,我寻找了一些原生的Swift套接字支持。

Thankfully, I found a much simpler alternative to using Async, called SwiftSocket. 值得庆幸的是,我找到了一个更简单的替代方法来使用Async,称为SwiftSocket。

The github ( https://github.com/xyyc/SwiftSocket ) has examples for most sockets, and is ready to use by copying just a few files into a project. github( https://github.com/xyyc/SwiftSocket )有大多数套接字的例子,可以通过将几个文件复制到项目中来使用。

For swift-only devs, I feel its underutilized and will quickly replace Async for non-objective-c apps. 对于仅限swift的开发人员,我觉得它未得到充分利用,很快就会替换非客观的应用程序的Async。 Then again I'm pretty new to this stuff so I may be way off :D 然后我又对这些东西很陌生,所以我可能会离开:D

very nice sample! 非常好的样品! My two cents.. fixed for swift 4.2. 我的两分钱......固定为快速4.2。 / Xcode 10, (I love using 20 lines instead of a bunch of other files.. and Pods.. ). / Xcode 10,(我喜欢用20行代替一堆其他文件..和Pods ..)。 Added some more returned results. 添加了一些返回的结果。

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)

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM