如何在不收到警告的情况下将套接字转换为SSLConnectionRef?

时间:2014-05-09 15:29:00

标签: ios macos sockets secure-transport

我正在学习如何使用Apple的安全传输框架为我的网络实施TLS,这有点令人困惑。我相信我应该将我的套接字fds转换为SSLConnectionRefs,但是当我这样做时会收到警告Cast to 'SSLConnectionRef' (aka 'const void *') from smaller integer type 'int'

int sockfd = socket(...);
...
SSLContextRef sslContext = SSLCreateContext(...);

// This line gives the warning
SSLSetConnection(sslContext, (SSLConnectionRef)sockfd);

我在这里没有丢失任何信息,因为void *大于int,对吗?所以这应该是安全的。我只关心编译器警告。感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

你应该做

SSLSetConnection(sslContext, (SSLConnectionRef)(intptr_t)sockfd);

答案 1 :(得分:0)

(SSLConnectionRef)(long)sockfd有效并且只要sizeof(void*) > sizeof(int)就应该是安全的,这对所有当前的编译器都是正确的,但不一定有保证。

另一种方法是暂时禁用警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wint-to-point-cast"
    SSLSetConnection(sslContext, (SSLConnectionRef)sockfd);
#pragma clang diagnostic pop

最终,"权利"解决方案是实际传入指向通过malloc或其他方案分配的整数的指针。如果这是一个对象,将fd存储在一个实例变量中并传入& _sockfd;