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

时间:2011-01-13 02:35:38

标签: windows sockets handle file-descriptor

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

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

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

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

  

现在问题是:

     

socket()的返回值吗?   和open()在Windows中是一样的吗?

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

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

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:-1)

  

socket()的返回值吗?   和open()在Windows中是一样的吗?

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