WinSock 可以把 SOCKET 类型转换成 int 保存么?

WinSock 可以把 SOCKET 类型转换成 int 保存么?

💡 原文中文,约2900字,阅读约需7分钟。
📝

内容提要

在 Linux/Unix 中,套接字使用文件描述符,而在 Win32 中则使用 SOCKET 类型。虽然 SOCKET 是指针,但可以安全地转换为 int 类型,因为它实际上是一个表格索引,每个进程的句柄数量有限。许多开源项目(如 OpenSSL)也采用这种方式。通过程序验证,创建和释放套接字时,索引是连续的。

🎯

关键要点

  • 在 Linux/Unix 中,套接字使用文件描述符 fd,类型为 int。

  • 在 Win32 中,套接字使用 SOCKET 类型,定义为 UINT_PTR,是一个指针。

  • SOCKET 可以安全地转换为 int 类型,因为它实际上是一个表格索引。

  • 每个进程的句柄数量有限,最多为 2^24 个。

  • 每个 SOCKET 背后都是一个指向 Kernel Object 的 Handle,Handle Table 是连续的。

  • 许多开源项目(如 OpenSSL)在 Windows 环境下将 SOCKET 类型直接用 int 存储。

  • 程序验证显示,创建和释放套接字时,索引是连续的,且释放的项目会被复用。

➡️

继续阅读