Windows中socket和HANDLE有什么区别?
我正在尝试让 Linux 服务器在 Windows 中运行。
在 Linux 中,套接字和文件描述符的处理方式相同。 一些系统 api 可用于套接字和文件描述符。
但是,我通过 Winsock 处理套接字,并通过 WIN API 处理 HANDLE(文件描述符)。
所以我需要知道一个整数是一个套接字还是一个句柄。
现在问题是:
socket()的返回值 和 open() 在 Windows 中是一样的吗?
如果它们总是不同,我可以编写自己的 socket() 和 open() 来包装系统的 socket() 和 open() 。 并记录系统api的返回值,无论该整数是socket还是HANDLE。
如果它们是一样的,我不知道该如何处理。
I'm trying to make a Linux server running in Windows.
Socket and file descriptor are treated the same in Linux.
Some system api are avaliable for both socket and file descriptor.
However, I deal with socket by Winsock and HANDLE(file descriptor) by WIN API.
So I need to know an integer is a socket or a HANDLE.
Now here is the question:
Would the return value from socket()
and open() be the same in Windows?
If they are always different, I can write my own socket() and open() to wrap system's one.
and record the return value from system's api whether the integer is a socket or HANDLE.
If they will be the same, I have no idea to deal with it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
套接字句柄是 Win32(NT 内核)句柄,因此您可以在它们上使用 ReadFile 或 WriteFile。还有与 Winsock 维护的句柄关联的用户模式状态,这就是为什么您需要使用 closesocket() 而不是 CloseHandle()。
open() 返回与 Win32 句柄不同的 CRT 文件描述符。您可以使用 _open_osfhandle()。但对于套接字,不建议这样做,因为您无法以干净的方式关闭文件。您可以使用 close() 来泄漏 Winsock 用户模式状态,或者使用 closesocket() 来泄漏 CRT 描述符。
Socket handles are Win32 (NT kernel) handles so you can, for example, use ReadFile, or WriteFile on them. There is also user-mode state associated with the handle which is maintained by Winsock which is why you need to use closesocket() instead of CloseHandle().
open() returns CRT file descriptors which is different from the Win32 handle. You can create a CRT file descriptor using _open_osfhandle(). But this is not recommened for sockets because you cannot close the file in a clean way. You either use close() which will leak the Winsock user-mode state, or closesocket() which will leak the CRT descriptor.
Windows 中的套接字句柄由 WINSOCK 子系统分配,该子系统根本不是文件系统的一部分。
Socket handles in Windows are allocated by the WINSOCK subsystem which isn't part of the file system at all.