130 lines
4.0 KiB
Swift
Executable File
130 lines
4.0 KiB
Swift
Executable File
import Foundation
|
|
|
|
/// The raw socket protocol which represents a TCP socket.
|
|
///
|
|
/// Any concrete implementation does not need to be thread-safe.
|
|
///
|
|
/// - warning: It is expected that the instance is accessed on the specific queue only.
|
|
public protocol RawTCPSocketProtocol : class {
|
|
/// The `RawTCPSocketDelegate` instance.
|
|
var delegate: RawTCPSocketDelegate? { get set }
|
|
|
|
/// If the socket is connected.
|
|
var isConnected: Bool { get }
|
|
|
|
/// The source address.
|
|
var sourceIPAddress: IPAddress? { get }
|
|
|
|
/// The source port.
|
|
var sourcePort: Port? { get }
|
|
|
|
/// The destination address.
|
|
var destinationIPAddress: IPAddress? { get }
|
|
|
|
/// The destination port.
|
|
var destinationPort: Port? { get }
|
|
|
|
/**
|
|
Connect to remote host.
|
|
|
|
- parameter host: Remote host.
|
|
- parameter port: Remote port.
|
|
- parameter enableTLS: Should TLS be enabled.
|
|
- parameter tlsSettings: The settings of TLS.
|
|
|
|
- throws: The error occured when connecting to host.
|
|
*/
|
|
func connectTo(host: String, port: Int, enableTLS: Bool, tlsSettings: [AnyHashable: Any]?) throws
|
|
|
|
/**
|
|
Disconnect the socket.
|
|
|
|
The socket should disconnect elegantly after any queued writing data are successfully sent.
|
|
|
|
- note: Usually, any concrete implementation should wait until any pending writing data are finished then call `forceDisconnect()`.
|
|
*/
|
|
func disconnect()
|
|
|
|
/**
|
|
Disconnect the socket immediately.
|
|
|
|
- note: The socket should disconnect as soon as possible.
|
|
*/
|
|
func forceDisconnect()
|
|
|
|
/**
|
|
Send data to remote.
|
|
|
|
- parameter data: Data to send.
|
|
- warning: This should only be called after the last write is finished, i.e., `delegate?.didWriteData()` is called.
|
|
*/
|
|
func write(data: Data)
|
|
|
|
/**
|
|
Read data from the socket.
|
|
|
|
- warning: This should only be called after the last read is finished, i.e., `delegate?.didReadData()` is called.
|
|
*/
|
|
func readData()
|
|
|
|
/**
|
|
Read specific length of data from the socket.
|
|
|
|
- parameter length: The length of the data to read.
|
|
- warning: This should only be called after the last read is finished, i.e., `delegate?.didReadData()` is called.
|
|
*/
|
|
func readDataTo(length: Int)
|
|
|
|
/**
|
|
Read data until a specific pattern (including the pattern).
|
|
|
|
- parameter data: The pattern.
|
|
- warning: This should only be called after the last read is finished, i.e., `delegate?.didReadData()` is called.
|
|
*/
|
|
func readDataTo(data: Data)
|
|
|
|
/**
|
|
Read data until a specific pattern (including the pattern).
|
|
|
|
- parameter data: The pattern.
|
|
- parameter maxLength: The max length of data to scan for the pattern.
|
|
- warning: This should only be called after the last read is finished, i.e., `delegate?.didReadData()` is called.
|
|
*/
|
|
func readDataTo(data: Data, maxLength: Int)
|
|
}
|
|
|
|
/// The delegate protocol to handle the events from a raw TCP socket.
|
|
public protocol RawTCPSocketDelegate: class {
|
|
/**
|
|
The socket did disconnect.
|
|
|
|
This should only be called once in the entire lifetime of a socket. After this is called, the delegate will not receive any other events from that socket and the socket should be released.
|
|
|
|
- parameter socket: The socket which did disconnect.
|
|
*/
|
|
func didDisconnectWith(socket: RawTCPSocketProtocol)
|
|
|
|
/**
|
|
The socket did read some data.
|
|
|
|
- parameter data: The data read from the socket.
|
|
- parameter from: The socket where the data is read from.
|
|
*/
|
|
func didRead(data: Data, from: RawTCPSocketProtocol)
|
|
|
|
/**
|
|
The socket did send some data.
|
|
|
|
- parameter data: The data which have been sent to remote (acknowledged). Note this may not be available since the data may be released to save memory.
|
|
- parameter by: The socket where the data is sent out.
|
|
*/
|
|
func didWrite(data: Data?, by: RawTCPSocketProtocol)
|
|
|
|
/**
|
|
The socket did connect to remote.
|
|
|
|
- parameter socket: The connected socket.
|
|
*/
|
|
func didConnectWith(socket: RawTCPSocketProtocol)
|
|
}
|