MSDN说的closesocket()是要使用的函数。然而,我忍不住想知道是否_close()也有效?
MSDN 似乎在 SOCKET 类型的描述中说不:(http://msdn.microsoft.com/en-us/windows/ms740516(v=vs.80)):
在 Winsock 应用程序中,套接字描述符不是文件描述符,必须与 Winsock 函数一起使用。
更具体地说,来自其关于重命名套接字函数的注释:
套接字由 Berkeley Sockets 中的标准文件描述符表示,因此该
close函数可用于关闭套接字以及常规文件。虽然 Windows Sockets 中没有任何内容可以阻止实现使用常规文件句柄来识别套接字,但也没有什么需要它。在 Windows 上,必须使用closesocket例程关闭套接字。在 Windows 上,使用该close函数关闭套接字是不正确的,并且本规范未定义这样做的效果。
然而,尽管如此,一些 Windows 文件函数在实践中可能与套接字一起工作:
鉴于ReadFileandWriteFile在套接字上工作,我怀疑_readand_write也可能与套接字以及文件句柄一起工作。
套接字句柄可以选择是 Windows Sockets 2 中的文件句柄。来自 Winsock 提供程序的套接字句柄可以与其他非 Winsock 函数(例如
ReadFile、WriteFile、ReadFileEx和 )一起使用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。
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |