如何将套接字转换为SSLConnectionRef而不得到警告?



我正在学习如何使用苹果的安全传输框架为我的网络实现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,对吧?所以这应该是安全的。我只是关心编译器的警告。谢谢你的建议。

你应该这样做

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

(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;

最新更新