Windows中的socket和HANDLE有什么区别?

Cel*_*ebi 9 sockets windows file-descriptor handle

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

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

但是,我通过WIN API处理Winsock和HANDLE(文件描述符)的socket.

所以我需要知道一个整数是一个套接字或一个HANDLE.

现在问题是:

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

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

如果它们是相同的,我不知道如何处理它.

Joh*_*ohn 13

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

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

  • @Seven,Winsock 2 有一个“分层服务提供者”架构,因此 Winsock 保留从句柄到提供者的映射。每个提供者都可以保留额外的状态。保留的附加状态(如果有)是实现细节。LSP 可能不会缓存/缓冲发送或接收的数据,因为这会破坏与在套接字句柄上使用 ReadFile 或 WriteFile 的应用程序的兼容性。 (2认同)