我有一段代码在Windows上调用recv()。recv()有时会返回-1。调用WSAGetLastError()返回0。这似乎是非常奇怪的行为。以前有没有人注意到这一点。 最佳答案 WSAGetLastError()目前是GetLastError()的简单别名。WinSock不保留自己单独的错误代码(尽管没有什么可以阻止Microsoft将来进行更改)。与任何其他Win32API函数一样,确保您没有在recv()和WSAGetLastError()之间进行任何Win32调用,否则您有丢失的风险错误代码。始终在执行任何其他操作之前,
#include#include#includestd::stringGetLastErrorMessage(){DWORDerrorCode=WSAGetLastError();LPSTRerrorMessage=nullptr;DWORDresult=FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,errorCode,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&error
我调用了WSARecv(),它返回了WSA_IO_PENDING。然后我从另一端发送了一个RST数据包。存在于另一个线程中的GetQueuedCompletionStatus()函数按预期返回了FALSE,但是当我调用WSAGetLastError()时,我得到了64而不是WSAECONNRESET。那么为什么WSAGetLastError()没有返回WSAECONNRESET?编辑:我忘了提到当我在WSARecv()失败后直接调用WSAGetLastError()时(因为RST数据包被接收),返回的错误代码是WSAECONNRESET而不是64。所以看起来返回的错误代码取决于WSAR
在我的代码中,我有带I/O完成端口的异步I/O,对于读/写完成回调,我得到一个HANDLE(当然可以是套接字、文件句柄、命名管道等)。所以如果在这样的例程中出现问题,我想检查错误,但是如何知道它是否是一个“网络”HANDLE(一个SOCKET,所以我应该调用WSAGetLastError())或“非网络”HANDLE(命名管道、文件等,所以我应该调用GetLastError())?我为此使用了一个简单的标志,但它丑陋且不方便。如果有人可以确认WSAGetLastError()只是GetLastError()的别名,我将只使用后者。似乎是这样:http://www.tech-archiv
标题也许说明了一切?Windows10、VisualStudioCommunity2017。C++服务器监听一个端口,并将生成的FD放入一个fd_set中用于输入,一个用于异常。select()被调用。它返回,并且一个连接被accept()ed。它的FD也被添加到这两个fd_sets。连接正常,然后结束。然后从两个fd_sets中删除它的FD。在下次调用select()时,我被告知监听套接字出现异常,但WSAGetLastError()为零。根据我的笔记,监听FD设置了O_NONBLOCK,因为:Theremaynotalwaysbeaconnectionwaitingaftersel