@@ -33,6 +33,13 @@ final class SocketManager: NSObject, ObservableObject {
3333
3434 private var socket : NWAsyncSocket ?
3535 private var readTag : Int = 0
36+ private var pendingManualDisconnect = false
37+
38+ private static func jyHeadData2013( ) -> Data {
39+ var value : Int64 = 2013
40+ let fullData = withUnsafeBytes ( of: & value) { Data ( $0) }
41+ return Data ( fullData. prefix ( 6 ) )
42+ }
3643
3744 // MARK: - Connection
3845
@@ -65,8 +72,14 @@ final class SocketManager: NSObject, ObservableObject {
6572
6673 /// Disconnect the current socket.
6774 func disconnect( ) {
68- socket? . disconnect ( )
69- socket = nil
75+ guard let socket = socket else {
76+ return
77+ }
78+ pendingManualDisconnect = true
79+ isConnected = false
80+ appendLog ( " ⏹ Disconnect requested by client " )
81+ socket. disconnect ( )
82+ self . socket = nil
7083 }
7184
7285 /// Send a string as UTF-8 data.
@@ -123,7 +136,15 @@ extension SocketManager: NWAsyncSocketDelegate {
123136
124137 func socket( _ sock: NWAsyncSocket , didConnectToHost host: String , port: UInt16 ) {
125138 isConnected = true
139+ pendingManualDisconnect = false
126140 appendLog ( " ✅ Connected to \( host) : \( port) " )
141+
142+ let handshake = Self . jyHeadData2013 ( )
143+ let handshakeTag = readTag
144+ readTag += 1
145+ sock. write ( handshake, withTimeout: 30 , tag: handshakeTag)
146+ appendLog ( " 🤝 Sent handshake ( \( handshake. count) bytes, tag: \( handshakeTag) ) " )
147+
127148 // Start reading
128149 sock. readData ( withTimeout: - 1 , tag: readTag)
129150 readTag += 1
@@ -145,9 +166,12 @@ extension SocketManager: NWAsyncSocketDelegate {
145166 isConnected = false
146167 if let error = error {
147168 appendLog ( " 🔴 Disconnected: \( error. localizedDescription) " )
169+ } else if pendingManualDisconnect {
170+ appendLog ( " 🟠 Disconnected (client requested) " )
148171 } else {
149- appendLog ( " 🔴 Disconnected" )
172+ appendLog ( " 🟡 Disconnected (peer closed connection) " )
150173 }
174+ pendingManualDisconnect = false
151175 }
152176
153177 func socket( _ sock: NWAsyncSocket , didReceiveSSEEvent event: SSEEvent ) {
0 commit comments