首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Win64下将套接字强制转换为int是否安全?

在Win64下将套接字强制转换为int是否安全?
EN

Stack Overflow用户
提问于 2009-12-24 00:02:11
回答 1查看 9K关注 0票数 29

我正在开发一个POSIX C++程序的Windows移植。

问题是,像accept()或bind()这样的标准POSIX函数需要‘int’作为第一个参数,而WinSock函数则使用‘SOCKET’。

当编译为32位时,一切都很好,因为两者都是32位的,但在Win64下套接字是64位的,而整数仍然是32位的,并且它会生成许多编译器警告,如下所示:

warning C4244: '=' : conversion from 'SOCKET' to 'int', possible loss of data

我试图通过使用typedef来解决这个问题:

#ifdef _WIN32
 typedef SOCKET sock_t;
#else
 typedef int sock_t;
#endif

并在适当的位置用sock_t替换‘int’s。

在我到达调用OpenSSL API的代码的一部分之前,这是很好的。

事实证明,即使在Win64上,OpenSSL也使用it作为套接字。这似乎真的很奇怪,所以我开始搜索答案,但我唯一找到的是openssl-dev邮件列表上的一篇旧帖子,其中提到了一个评论e_os.h:

/*
 * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because
 * the value constitutes an index in per-process table of limited size
 * and not a real pointer.
 */

所以我的问题是:

将套接字转换为int真的安全吗?

我希望看到一些文档来证明套接字的值不能大于2^32。

提前感谢!

Ryck

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1953639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档