gpt4 book ai didi

sockets - 你能在 Windows 上 close()、read() 和 write() 套接字吗?

转载 作者:行者123 更新时间:2023-12-02 07:34:18 25 4
gpt4 key购买 nike

MSDN 说 closesocket() 是要使用的函数。但是,我忍不住想知道 _close() 是否也能工作?

MSDN 在 SOCKET 类型的描述中似乎说不:( http://msdn.microsoft.com/en-us/windows/ms740516(v=vs.80) ):

In Winsock applications, a socket descriptor is not a file descriptor and must be used with the Winsock functions.

更具体地说,来自其 note on renamed socket functions :

Sockets are represented by standard file descriptors in Berkeley Sockets, so the close function can be used to close sockets as well as regular files. While nothing in Windows Sockets prevents an implementation from using regular file handles to identify sockets, nothing requires it either. On Windows, sockets must be closed by using the closesocket routine. On Windows, using the close function to close a socket is incorrect and the effects of doing so are undefined by this specification.

但是,尽管存在上述情况,一些 Windows 文件函数实际上可能与套接字一起使用:

鉴于ReadFileWriteFile在套接字上工作,我怀疑例如 _read_write 也可能与套接字以及文件句柄一起工作。

MSDN's overview of socket handles状态:

A socket handle can optionally be a file handle in Windows Sockets 2. A socket handle from a Winsock provider can be used with other non-Winsock functions such as ReadFile, WriteFile, ReadFileEx, and WriteFileEx.

最佳答案

简短的回答是。 Windows 上的套接字句柄不是 Unix 上的文件句柄。有特殊的支持,例如低级 Win32 API、ReadFile 和 WriteFile 可以与套接字句柄一起使用。但事情可能就到此为止了。

关于 _open_osfhandle,是的,这可能在非常有限的意义上起作用,但有充分的理由说明为什么你不应该这样做。以下大部分内容是我通过浏览 CRT 源代码(Visual Studio 附带的)中的 open、read、write、close 和 open_osfhandle 的源代码推断出来的。

  • CRT 读/写调用会进行大量缓冲。任何将读/写与接收/发送混合的尝试都将进入未定义的行为。

  • 性能。只需查看 CRT 源代码中的 read() 和 write() 源代码即可。许多包装器代码最终调用 ReadFile 和 WriteFile,而后者又必须转发到实际的套接字 API。

  • 套接字错误代码可能不会像您想象的那样冒泡到文件 API。请记住,套接字 API 错误是通过 WSAGetLastError 返回的。 Win32 文件 IO 调用通过 GetLastError 冒泡。因此,如果您对 write() 的调用遇到套接字错误,它可能会尝试通过 GetLastError 映射返回值,这仍然返回成功。

  • close() 不会正确关闭套接字句柄,因为它映射到 CloseHandle,而不是 closesocket。

关于sockets - 你能在 Windows 上 close()、read() 和 write() 套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com