Files
proxypin/ios/ProxyPin/vpn/Connection.swift
2025-05-30 22:01:18 +08:00

108 lines
3.3 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// Connection.swift
// ProxyPin
//
// Created by wanghongen on 2024/9/17.
//
import Foundation
import Foundation
import Network
import os.log
class Connection{
var nwProtocol: NWProtocol
var sourceIp: UInt32
var sourcePort: UInt16
var destinationIp: UInt32
var destinationPort: UInt16
var channel: NWConnection?
var isInitConnect: Bool = false
var isConnected: Bool = false
var isClosingConnection: Bool = false
var isAbortingConnection: Bool = false
var isAckedToFin: Bool = false
private let connectionCloser: ConnectionManager
init(nwProtocol: NWProtocol, sourceIp: UInt32, sourcePort: UInt16, destinationIp: UInt32, destinationPort: UInt16, connectionCloser: ConnectionManager) {
self.nwProtocol = nwProtocol
self.sourceIp = sourceIp
self.sourcePort = sourcePort
self.destinationIp = destinationIp
self.destinationPort = destinationPort
self.connectionCloser = connectionCloser
}
//vpn
var sendBuffer = Data()
var hasReceivedLastSegment = false
//
var lastIpHeader: IP4Header?
var lastTcpHeader: TCPHeader?
var lastUdpHeader: UDPHeader?
var timestampSender = 0
var timestampReplyTo = 0
//
var recSequence: UInt32 = 0
//tcpSYN
var maxSegmentSize = 0
//ackack
var sendUnAck: UInt32 = 0
//ack
var sendNext: UInt32 = 0
static func getConnectionKey(nwProtocol: NWProtocol, destIp: UInt32, destPort: UInt16, sourceIp: UInt32, sourcePort: UInt16) -> String {
let destIpString = PacketUtil.intToIPAddress(destIp)
let sourceIpString = PacketUtil.intToIPAddress(sourceIp)
return "\(nwProtocol)|\(sourceIpString):\(sourcePort)->\(destIpString):\(destPort)"
}
func closeConnection() {
connectionCloser.closeConnection(connection: self)
}
func addSendData(data: Data) {
self.sendBuffer.append(data)
if (self.channel?.state != .ready) {
os_log("Connection %{public}@ is not ready, cannot send data", log: OSLog.default, type: .debug, self.description)
return
}
self.sendToDestination()
}
//
func sendToDestination() {
// os_log("Sending data to destination key %{public}@", log: OSLog.default, type: .debug, self.description)
if (self.sendBuffer.count == 0) {
return
}
let data = self.sendBuffer
self.sendBuffer.removeAll()
self.channel?.send(content: data, completion: .contentProcessed({ error in
if let error = error {
os_log("Failed to send data to destination key %{public}@ error: %{public}@", log: OSLog.default, type: .error, self.description, error.localizedDescription)
self.closeConnection()
}
}))
}
var description: String {
return Connection.getConnectionKey(nwProtocol: nwProtocol, destIp: destinationIp, destPort: destinationPort, sourceIp: sourceIp, sourcePort: sourcePort)
}
}