SwiftDSSocket 0.1.2

SwiftDSSocket 0.1.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年12月
SwiftSwift 版本3.0
SPM支持 SPM

jedihy 维护。



Travis-CI
macOS
iOS
Swift Version
CocoaPods
Carthage Compatible
SwiftPM Compatible

SwiftDSSocket

概览

SwiftDSSocket 是一个基于 DispatchSource 的纯 Swift 构建 异步 套接字框架。函数签名与 CocoaAsyncSocket 非常类似,因为我通过学习 CocoaAsyncSocket 的源代码来实现这个框架。构建这个框架的最初想法是由网络库与 KEXT (NKE) 通信的需要来驱动我的 Proximac 项目,但我找到的框架都不支持这一点。因此,我决定实现自己的框架来实现这一点。

注意:这个框架仍在积极开发中。它只通过了我的单元测试,可能存在各种错误。

功能

完全支持代理

  • 每个操作都会调用您的方法。

IPv6 支持

  • 只监听 IPv6 协议,但 接受 IPv4 和 IPv6 entering connections。
  • 符合 Apple 对仅 IPv6 环境的 App Store 限制 NAT64/DNS64。

DNS 启用

  • 利用 iOS 9 和 OS X 10.11 中引入的合成 IPv6 地址,以更好地支持 IPv6。
  • 使用 GCD 进行 DNS 并发,并连接到第一个可达地址。

KEXT 双向交互

  • 使用 bundle ID 与您的 KEXT 进行交互,就像 TCP 流。

使用 SwiftDSSocket

包括在你的项目中

Swift 包管理器

要将 SwiftDSSocket 包含到 Swift 包管理器包中,将其添加到在您的 Package.swift 文件中定义的 dependencies 属性中。例如

    dependencies: [
        .Package(url: "https://github.com/csujedihy/SwiftDSSocket", "x.x.x")
    ]

CocoaPods

要使用 CocoaPods 在项目中包含 SwiftDSSocket,只需将 SwiftDSSocket 添加到您的 Podfile 中,例如

    target 'MyApp' do
        use_frameworks!
        pod 'SwiftDSSocket'
    end

Carthage

要使用 Carthage 在项目中包含 SwiftDSSocket,请向您的 Cartfile 中添加一行,其中包含 GitHub 组织和项目名称以及版本。例如

    github "csujedihy/SwiftDSSocket"

文档

https://csujedihy.github.io/SwiftDSSocket/

例子

以下示例创建了一个默认的 SwiftDSSocket 实例,然后立即开始监听端口 9999,并回显发送到该服务器的所有内容。

您可以使用 telnet 127.0.0.1 9999 连接到此服务器并发送您想要的任何内容。

import Cocoa
import SwiftDSSocket

class ViewController: NSViewController {
  var server: SwiftDSSocket?
  var newClient: SwiftDSSocket?
  let ServerTag = 0
  
  override func viewDidLoad() {
    super.viewDidLoad()
    server = SwiftDSSocket(delegate: self, delegateQueue: .main, type: .tcp)
    try? server?.accept(onPort: 9999)
  }
}


extension ViewController: SwiftDSSocketDelegate {
  func socket(sock: SwiftDSSocket, didAcceptNewSocket newSocket: SwiftDSSocket) {
    newClient = newSocket
    newSocket.readData(tag: ServerTag)
  }
  
  func socket(sock: SwiftDSSocket, didRead data: Data, tag: Int) {
    sock.write(data: data, tag: ServerTag)
    sock.readData(tag: ServerTag)
  }
}

提示:查看 Demo 文件夹以查看不同环境下的更多示例。