9

我正在尝试制作一个在 Windows 中运行的 Linux 服务器。

套接字和文件描述符在 Linux 中的处理方式相同。一些系统 api 可用于套接字和文件描述符。

但是,我通过 Winsock 处理套接字,并通过 WIN API 处理 HANDLE(文件描述符)。

所以我需要知道一个整数是一个套接字还是一个句柄。

现在问题来了:

socket() 和 open() 的返回值在 Windows 中是否相同?

如果它们总是不同,我可以编写自己的 socket() 和 open() 来包装系统的。并记录系统api的返回值,无论整数是socket还是HANDLE。

如果它们相同,我不知道如何处理它。

4

2 回答 2

16

套接字句柄是 Win32(NT 内核)句柄,因此您可以对它们使用 ReadFile 或 WriteFile。还有与由 Winsock 维护的句柄相关的用户模式状态,这就是为什么需要使用 closesocket() 而不是 CloseHandle() 的原因。

open() 返回不同于 Win32 句柄的 CRT 文件描述符。您可以使用_open_osfhandle()创建 CRT 文件描述符。但这不推荐用于套接字,因为您无法以干净的方式关闭文件。您可以使用 close() 来泄漏 Winsock 用户模式状态,或者使用 closesocket() 来泄漏 CRT 描述符。

于 2011-01-14T06:53:01.907 回答
-1

socket() 和 open() 的返回值在 Windows 中是否相同?

Windows 中的套接字句柄由 WINSOCK 子系统分配,该子系统根本不是文件系统的一部分。

于 2011-01-13T05:17:00.480 回答