什么';Windows中套接字和句柄的区别是什么?

什么';Windows中套接字和句柄的区别是什么?,windows,sockets,handle,file-descriptor,Windows,Sockets,Handle,File Descriptor,我正在尝试使Linux服务器在Windows中运行 套接字和文件描述符在Linux中的处理方式相同。 一些系统api可用于套接字和文件描述符 然而,我用Winsock处理套接字,用WinAPI处理(文件描述符) 所以我需要知道整数是套接字还是句柄 现在的问题是: 将从套接字()返回值 和open()在Windows中是否相同 如果它们总是不同的,我可以编写自己的socket()和open()来包装系统的socket()。 并记录来自系统api的返回值,无论该整数是套接字还是句柄 如果它们是一样的

我正在尝试使Linux服务器在Windows中运行

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

然而,我用Winsock处理套接字,用WinAPI处理(文件描述符)

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

现在的问题是:

将从套接字()返回值 和open()在Windows中是否相同

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

如果它们是一样的,我不知道该怎么处理

将从套接字()返回值 和open()在Windows中是否相同

Windows中的套接字句柄由根本不属于文件系统的WINSOCK子系统分配。

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


open()返回与Win32句柄不同的CRT文件描述符。您可以使用创建CRT文件描述符。但不建议对套接字执行此操作,因为您无法以干净的方式关闭文件。您可以使用close()泄漏Winsock用户模式状态,也可以使用closesocket()泄漏CRT描述符。

如果可能,您能否解释与
SOCKET
句柄关联的用户模式状态的数量和类型?这很重要,因为缓存等状态会影响套接字函数与非套接字函数的交互方式。@第七,Winsock 2具有“分层服务提供程序”体系结构,因此Winsock保留从句柄到提供程序的映射。每个提供者可以保留其他状态。保留的其他状态(如果有)是实现细节。LSP可能不会缓存或缓冲发送或接收的数据,因为这会破坏与在套接字句柄上使用ReadFile或WriteFile的应用程序的兼容性。在过去,这种情况一直是正确的,但在Windows NT中,套接字句柄现在是完整的内核对象,并且不仅作为用户模式DLL实现,尽管仍然存在一些用户模式状态今天