WSARecv()返回SOCK_ERROR ,同时WSAGetLastError()返回0 的情况
刚刚遇到一个问题在网上找了好多回答,但是还是不太清楚为什么。如果有哪位大虾明白怎么回事请赐教。
1 int iRet = WSARecv(lpPerIoData->m_skt, lpPerIoData->m_wsaRecvDataBuf,
2 lpListenNode->m_dwRecvBufCount, &(lpPerIoData->m_dwByteRecv),
3 &dwFlags, &(lpPerIoData->m_overLapped), NULL);
4 if (SOCKET_ERROR == iRet)
5 {
6 MessageBox(m_hWnd, _T("异步操作"), NULL, 0);
7 int iErrorCode = WSAGetLastError();
8 if (WSA_IO_PENDING == iErrorCode)
9 {
10 MessageBox(m_hWnd, _T("异步成功"), NULL, 0);
11 }else if (0 == iErrorCode)
12 {
13 MessageBox(m_hWnd, _T("操作没有错误"), NULL, 0);
14 }else{
15 CString strCode;
16 strCode.Format(_T("错误代码:%d"),iErrorCode);
17 MessageBox(m_hWnd, strCode, NULL, 0);
18 }
19 }
这是用于一个完成端口的服务器的部分代码,我发现WSAGetLastError()的返回值总是0.
可是MSDN上面WSAGetLastError()返回的错误代码是从6开始的啊,怎么会返回0呢?后来查了GetLastError()知道返回0的还一是没错误发生。
虽然查了文档和网上的回答,知道返回0的含义是说“以上操作都成功,没有错误发生”。
可是我在用异步IO模型的时候WSAGetLastError()为什么返回值总是 WSA_IO_PENDING 呢?
而且如果没有错误发生的话WSARecv为什么会返回SOCK_ERROR呢?(如果我理解的没错WSARecv调用成功应该返回0)
虽然目前不会影响我使用这个函数,但是心里面总觉得怪怪的。
如果有同样疑问的朋友欢迎一起来讨论。如果有知道怎么回事的朋友请赐教,求讲解。
浙公网安备 33010602011771号