繁体   English   中英

Swift NWConnection with Discord IPC(协议错误)

Swift NWConnection with Discord IPC (protocol error)

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我尝试使用 IPC 与 Discord 连接,但无论我尝试什么,错误消息都保持不变Optional("\u{02}\0\0\0(\0\0\0{"code":1003,"message":"protocol error"}")

我从encode function 开始,但那是UInt8 ,因为 Swift 显然不支持UInt32数据 object。

然后我尝试创建一个UInt32 (内存)数组,将其转换为Data ,但也失败了。

有人能指出我犯错的方向吗?

import Foundation
import Cocoa
import Network

class Discord {
    enum opcode: UInt32 {
        case handshake = 0
        case frame = 1
        case close = 2
        case ping = 3
        case pong = 4
    }

    var appID: String
    private var connection: NWConnection?
    private let endpoint: String = NSTemporaryDirectory() + "discord-ipc-0"

    init(appID: String) {
        self.appID = appID
    }

    func connect() {
        print("Connecting to \(endpoint)")

        connection = NWConnection(
            to: NWEndpoint.unix(path: endpoint),
            using: .tcp
        )

        connection?.stateUpdateHandler = { state in
            switch state {
            case .setup:
                print("Setting up...")
            case .preparing:
                print("Prepairing...")
            case .waiting(let error):
                print("Waiting: \(error)")
            case .ready:
                print("Ready...")
            case .failed(let error):
                print("Failed: \(error)")
            case .cancelled:
                print("Cancelled :'(")
            default:
                break
            }
        }

        connection?.receiveMessage { completeContent, contentContext, isComplete, error in
            print(
                String(data: completeContent ?? Data(), encoding: .utf8),
                error
            )
        }

        connection?.start(queue: .global())
    }

    func uint32encode(opcode: opcode, message string: String) -> Data {
        let payload = string.data(using: .utf8)!

        var buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 8 + payload.count, alignment: 0)

        defer { buffer.deallocate() }

        buffer.copyBytes(from: payload)
        buffer[8...] = buffer[..<payload.count]
        buffer.storeBytes(of: opcode.rawValue, as: UInt32.self)
        buffer.storeBytes(of: UInt32(payload.count), toByteOffset: 4, as: UInt32.self)

        let uIntData = Data(bytes: &buffer, count: 8 + payload.count)

        return uIntData
    }


    func encode(opcode: opcode, message string: String) -> Data {
        let jsondata = string.data(using: .utf8)!

        var data = Data()
        data.append(UInt8(opcode.rawValue))
        data.append(UInt8(jsondata.count))
        data.append(contentsOf: [UInt8](jsondata))

        /*
         uint32 opcode (0 or 1)
         uint32 length (length)
         byte[length] jsonData (??)
         */
        return data
    }

    func handshake() {
        connect()

        // We should say "hello", with opcode handshake
        let hello = encode(opcode: .handshake, message: "{\"v\":1,\"client_id\":\"\(appID)\"}")

        print("Sending \(String.init(data: hello, encoding: .utf8))")
        connection?.send(
            content: hello,
            completion: .contentProcessed({ error in
                print("Error:", error?.localizedDescription)
            })
        )
    }

    func handshakev2() {
        connect()

        // We should say "hello", with opcode handshake
        let hello = uint32encode(opcode: .handshake, message: "{\"v\":1,\"client_id\":\"\(appID)\"}")

        print("Sending (V2) \(String.init(data: hello, encoding: .utf8))")
        connection?.send(
            content: hello,
            completion: .contentProcessed({ error in
                print("Error (V2):", error?.localizedDescription)
            })
        )
    }
}
问题暂未有回复.您可以查看右边的相关问题.
3 Swift,NWConnection UDP接收超时?

我的应用程序通过udp向服务器发送消息,然后等待答复。 但是存在随机丢包现象。 我想通过超时检测数据包丢失,如何快速处理? 我无法从文档中找到它。 ...

4 未知的结果与 TCP/IP 与 NWConnection 迅速

我正在为服务器编写一个套接字连接,它说: EthMan 使用原始 TCP/IP 连接(不是 HTTP)进行远程管理和统计。 可选地,“psw”字段添加到请求是为矿工设置的远程管理密码。 以下命令可用(JSON 格式): 我尝试了很多图书馆,但没有一个对我有用!! 我得到的最好结果是使用 ...

5 通用协议Swift 4错误

以下代码在Swift 3.2上可以为我工作,但是在Swift 4的最新版本中,我遇到了一个奇怪的错误,无法理解。 我正在尝试创建一个通用协议,如下所示: 并在这里使用它: 错误: “组件”没有名为“工厂”的成员类型; 你是说“工厂”吗? 当然,自动修复也无济于 ...

6 Swift协议错误

我在Swift文件中声明了protocol : 我想在ObjC文件中使用该协议: 我收到此错误: 无法解决这个问题。 有想法吗? 在我的project-swift.h文件中,变体delegate完全没有显示: ...

7 具有关联类型错误的Swift协议

我创建了一个函数类: Bar , Bar使用属于它的委托做特定的事情,这个委托符合协议FooDelegate ,类似的东西: 但在类Bar: var delegate:FooDelegate! 我收到一个错误: 协议'FooDelegate'只能用作通用约束,因为它具有Sel ...

9 UDP是IPC的可靠协议吗?

如果我纯粹使用UDP进行进程间通信(即,在1个系统中, 不涉及网络 ),我可以认为它是可靠的吗? 或者我仍然需要担心丢包等问题? 请注意 ,这是一个实际问题,而不是理论问题。 如果操作系统的答案不同,请解释如何,特别是包括Windows,Linux和Mac。 编辑:不,这不可靠 ...

10 使用其他协议的Swift协议导致错误

我正在使用Swift 4。 我想定义一个问题。 问题由问题和答案组成。 该问题可能是以下任意一项:字符串,整数,[整数],图像,[图像]或未定义的某些新类型,或者可能是上述形式的某种组合。 答案也可以是上述任何一种,但是给定的问题可以具有不同类型的答案。 (例如问题 ...

暂无
暂无

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

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