Swift TCP:`Darwin.send` 函数的安全缓冲区大小
Swift TCP: safe buffer size for `Darwin.send` function
我正在 Swift 3 中为 macOS 和 iOS 构建一个小型且易于使用的 TCP
框架(总有一天它会支持 Linux)。这是我探索的新事物,这就是为什么存在混淆和错误的可能性。
我的内部代码如下所示:
if Darwin.send(self._fileDescriptor._value, data.withUnsafeBytes { [=12=] }, data.count, 0)._isMinusOne() {
try Error._throw(type: .network)
}
发送小包不是问题,但是当我尝试发送大包时我的应用程序崩溃了(我试图一次发送 1590784 字节)。之后我调查了这个问题,发现我错过了可以传递给 Darwin.send
函数的限制。我一直在网上搜索以找到一个好的答案,但不幸的是,我发现了一些关于这个特定主题的数字(65K、1500 等)。
我的问题是我应该在 Darwin.send
函数中使用多大的缓冲区大小才能始终安全?
我在那个特定领域没有那么多经验,所以如果我的问题的答案能解释为什么你认为你选择的尺寸是最好和最安全的选择,那就太好了。
我不知道可以传递给 send()
的缓冲区大小有限制。
但是,return 将您获得的指针作为参数指向您在 data.withUnsafeBytes
中的块是不安全的。我认为你不能保证它指向块 returns.
之后的有效内存区域
你应该试试
let bytesSent = data.withUnsafeBytes{
return Darwin.send(self._fileDescriptor._value, [=10=], data.count, 0)
}
更新
我已经检查了 source code 和 withUnsafeBytes
并且我可以确认方法调用没有做出任何努力来保留指向超出您传递给它的闭包范围的内存。您要做的是在释放内存后引用内存。我确定这就是您崩溃的根源。
我正在 Swift 3 中为 macOS 和 iOS 构建一个小型且易于使用的 TCP
框架(总有一天它会支持 Linux)。这是我探索的新事物,这就是为什么存在混淆和错误的可能性。
我的内部代码如下所示:
if Darwin.send(self._fileDescriptor._value, data.withUnsafeBytes { [=12=] }, data.count, 0)._isMinusOne() {
try Error._throw(type: .network)
}
发送小包不是问题,但是当我尝试发送大包时我的应用程序崩溃了(我试图一次发送 1590784 字节)。之后我调查了这个问题,发现我错过了可以传递给 Darwin.send
函数的限制。我一直在网上搜索以找到一个好的答案,但不幸的是,我发现了一些关于这个特定主题的数字(65K、1500 等)。
我的问题是我应该在 Darwin.send
函数中使用多大的缓冲区大小才能始终安全?
我在那个特定领域没有那么多经验,所以如果我的问题的答案能解释为什么你认为你选择的尺寸是最好和最安全的选择,那就太好了。
我不知道可以传递给 send()
的缓冲区大小有限制。
但是,return 将您获得的指针作为参数指向您在 data.withUnsafeBytes
中的块是不安全的。我认为你不能保证它指向块 returns.
你应该试试
let bytesSent = data.withUnsafeBytes{
return Darwin.send(self._fileDescriptor._value, [=10=], data.count, 0)
}
更新
我已经检查了 source code 和 withUnsafeBytes
并且我可以确认方法调用没有做出任何努力来保留指向超出您传递给它的闭包范围的内存。您要做的是在释放内存后引用内存。我确定这就是您崩溃的根源。