下面的操场演示了这个问题。

    //: 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/

10-11 21:01