下面的操场演示了这个问题。
//: Playground - noun: a place where people can play
import Foundation
var s = socket(AF_INET, SOCK_STREAM, 0)
var tv = timeval()
tv.tv_sec = 3
tv.tv_usec = 100000
let tvSize = socklen_t(sizeof(timeval))
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, tvSize)
NSError(domain: NSPOSIXErrorDomain, code: Int(errno), userInfo: nil)
结果是
setsockopt()
得到-1,NSError返回EINVAL
Error Domain=NSPOSIXErrorDomain Code=22 "Invalid argument"
这是Mac OS X 10.11,xcode版本7.0 beta 5(7A176x)
任何帮助都将不胜感激。
最佳答案
海报在苹果论坛上也提出了同样的问题,还有一位苹果工程师。
解决方案的要点是,要与C api交互,通常需要使用strideof(T)
来考虑尾部结构填充,这与C的sizeof()
运算符的方式相同。更常用的sizeofValue()
不会这样做。
当运行在32位机型(即iPhone 5之前和包括iphone5)上时,这个问题并没有显现出来,sizeofValue(timeval)
和strideof(timeval)
都是8。
在64位模型上,对应的大小是12和16,这导致当通过12而不是预期的16时,O/S会抱怨EINVAL
。
关于swift - Swift setsockopt SOL_SOCKET SO_RCVTIMEO获取无效参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32107695/