摘要
所以我在套接字连接包装类中添加了重新连接功能,但遇到了内存问题。
因此,对于我的测试,我创建一个套接字,打开网络链接调节器以获得100%的数据包丢失,然后尝试连接,当它超时时,我关闭套接字,创建一个新套接字然后再次尝试连接。这会导致各种内存问题;主要是'释放的指针未被分配'FYI socket.blocking设置为true,并且在主线程上调用connect。
最初我没有在超时后创建新套接字,但是当我尝试连接时,这会导致错误的文件描述符错误。这是因为我试图在超时后关闭套接字。我这样做是因为每当类被发送到它的断开状态时它就会关闭套接字。
所以这是我的问题,每次我想连接正确的方式时都会创建新的套接字吗?也许这是我不知道的糟糕做法。那个附录就是为什么我因为创建套接字而导致可怕的内存崩溃?
详情
我使用网络链接调节器并更改我的连接,以便100%丢包以测试我的重新连接代码。
// called on the main thread
do {
print("Connecting")
try socket.connect(to: host, port: Int32(port), timeout: UInt(DispatchTimeInterval.milliseconds(3000).rawValue))
machine.modify { $0.state = .connected }
} catch {
// something went wrong, disconnect and pass the error
initiateDisconnect(error: error)
}
连接在给定的持续时间后超时并返回以下错误:
▿ Error code: -9968(0x-26F0), Operation now in progress
- domain : "com.ibm.oss.Socket.ErrorDomain"
- errorCode : -9968
▿ errorReason : Optional<String>
- some : "Operation now in progress"
- bufferSizeNeeded : 0
奇怪的描述,但无论在Socket.swift中,它都说它是一个超时
public static let SOCKET_ERR_CONNECT_TIMEOUT = -9968
很酷,这就是我们所期望的,所以现在我的重新连接逻辑开始了,再次运行上面的代码,但这次我们得到了错误的描述符错误
▿ Error code: -9998(0x-270E), Socket has an invalid descriptor
- domain : "com.ibm.oss.Socket.ErrorDomain"
- errorCode : -9998
▿ errorReason : Optional<String>
- some : "Socket has an invalid descriptor"
- bufferSizeNeeded : 0
怪异。所以我跳进connect()你会看到以下
// The socket must've been created and must not be connected...
if self.socketfd == Socket.SOCKET_INVALID_DESCRIPTOR {
throw Error(code: Socket.SOCKET_ERR_BAD_DESCRIPTOR, reason: "Socket has an invalid descriptor")
}
错了,所以我在代码中查看,似乎在关闭套接字后socket.socketfd被设置为INVALID。正如您在我的代码中看到引发异常的那样,我将内部状态机转换为关闭套接字的断开连接。
好的,所以在我断开连接之后,我只需要创建一个新套接字,这将解决我的错误文件描述符问题。
let socket = try Socket.create(family: .inet)
try socket.setBlocking(mode: true)
然后一切都崩溃了
malloc: *对象0x60c000201450的错误:未分配被释放的指针 * 在malloc_error_break中设置断点以进行调试
我添加了一个符号断点,当调用socket.close时它会爆炸。具体来说,当我尝试在系统尝试在超时后尝试打开连接时关闭其中一个套接字时,就会完成此操作。
所以这就是结束的地方。我不知道如何解决这个内存问题。我可以通过简单地关闭连接来绕过它,但如果我想实际断开连接,这将导致将来出现问题。