11

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

因此,如果在这样的例程中出现问题,我想检查错误,但是如何知道它是“网络” HANDLE(a 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 来说是正确的——但我们不能在假设的情况下编写好的代码 :)

4

2 回答 2

13

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

于 2013-03-23T11:46:45.543 回答
9

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

既然已经有了完美的函数SetLastError,为什么还存在函数WSASetLastError?

其实,你也知道答案,如果你坐下来想一想。

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

于 2014-02-20T10:42:29.167 回答