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

11
在我的代码中,我使用了I/O完成端口实现异步I/O,在读/写完成回调中,我会得到一个HANDLE(当然可以是套接字、文件句柄、命名管道等)。
因此,如果在这样的例程中出现问题,我想检查错误,但如何知道它是“网络”HANDLE(即SOCKET,因此应调用WSAGetLastError())还是“非网络”HANDLE(命名管道、文件等,因此应调用GetLastError())?我使用了一个简单的标志来解决这个问题,但它很丑陋,也不方便。
如果有人能够确认WSAGetLastError()只是GetLastError()的别名,那么我将仅使用后者。
看起来是这样的:

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()替代WSAGetLastError()是否安全?我的意思是,如果WSAGetLastError()自Windows95以来甚至是GetLastError()的别名,那么我可以假设它对于下一个版本的Windows也是正确的--但我们不能仅凭假设写出好的代码 :)
2个回答

13

它只是一个包装器,如果您反向工程ws2_32.dll,您会发现它是调用GetLastError的。


是的,我看到了,但您会使用GetLastError()而不是WSAGetLastError()吗? 我认为他们不会分离这两个函数,至少目前还没有。 - Marco Pagliaricci
1
我认为使用WSAGetLastError更安全,因为它可以处理特定的Winsock错误。但这只是我的个人意见。 - Xearinox
1
在编程中,按照文档建议使用函数更为规范。然而,在这种特殊情况下,这两个函数极不可能被拆分成两个独立的函数,因此现在这样使用更为简洁明了。 - Roman R.
3
如果它们是相同的,那么当Winsock没有像现在这样内置到内核中时,它们曾经是不同的,并且没有任何保证它们在未来的某个系统中不会不同。请使用WSAGetLastError()函数。 - user207421

8
有两个类似函数的原因:http://blogs.msdn.com/b/oldnewthing/archive/2005/09/08/462402.aspx 为什么已经有完美好用的SetLastError函数,还需要WSASetLastError函数呢?如果你坐下来想一想,其实你也知道答案。
Winsock最初是开发用于16位和32位Windows系统。请注意,经典Winsock函数基于窗口消息进行异步通知。在16位系统中,没有SetLastError函数。因此,Winsock必须提供其自己的16位版本。并且由于源代码兼容性很重要,还需要一个32位版本。当然,如果你不知道16位版本的话,看起来32位版本有点愚蠢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接