WSAGetLastError()只是GetLastError()的别名吗?

时间:2013-03-23 11:28:30

标签: windows winapi networking network-programming

在我的代码中,我有I / O完成端口的异步I / O,对于读/写完成回调,我得到一个HANDLE(当然可以是一个套接字,文件句柄,命名管道等。)

因此,如果此例程出现问题,我想检查错误,但是如何知道它是否是“网络”HANDLESOCKET,所以我应该调用{{1} })或“非网络”WSAGetLastError()(命名管道,文件等,所以我应该调用HANDLE)?我正在使用一个简单的标志,但它的丑陋和不方便。

如果有人可以确认GetLastError()只是WSAGetLastError()的别名,我将只使用后者。

似乎如此:

http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.networks/2007-08/msg00034.html

http://us.generation-nt.com/wsagetlasterror-just-an-alias-getlasterror-help-28256642.html

但有人可以证实吗? MSDN在这个主题上并不是很清楚。

使用GetLastError()代替GetLastError()是否安全?我的意思是,如果WSAGetLastError()甚至是Windows95的别名WSAGetLastError(),因为Windows95就像有人声称的那样,我可以假设它对于下一个版本的Windows也是如此 - 但是我们不能写出好的代码假设:)

2 个答案:

答案 0 :(得分:12)

如果您对ws2_32.dll进行逆向工程,它只是GetLastError的包装器,您会找到它。

答案 1 :(得分:9)

有两个类似功能的原因:http://blogs.msdn.com/b/oldnewthing/archive/2005/09/08/462402.aspx

  

为什么函数WSASetLastError在已经存在完美的函数SetLastError时存在?

     

实际上,如果你坐下来思考它,你也知道答案。

     

Winsock最初开发用于在16位Windows和32位Windows上运行。请注意经典Winsock函数是如何基于异步通知的窗口消息的。在16位世界中,没有SetLastError函数。因此,Winsock必须为16位实现提供自己的版本。由于源代码兼容性很重要,因此也有32位版本。当然,如果您不了解16位版本,那么32位版本在回顾过程中看起来有点愚蠢。