InternetReadFileEx 给出 10035 和 1008 错误
Posted
技术标签:
【中文标题】InternetReadFileEx 给出 10035 和 1008 错误【英文标题】:InternetReadFileEx gives 10035 and 1008 errors 【发布时间】:2013-06-20 13:54:05 【问题描述】:我正在尝试编写异步 Wininet 应用程序。在 INTERNET_STATUS_REQUEST_COMPLETE 的情况下,我在回调函数中读取数据,并且我也处理 ERROR_IO_PENDING 错误。但是在从 Internet 读取一些数据后,InternetReadFileEx 函数给了我 10035=WSAEWOULDBLOCK(无法立即完成非阻塞套接字操作)错误。在该错误之后,我再次调用 InternetReadFileEx,这一次它给了我 1008=ERROR_NO_TOKEN(尝试引用不存在的令牌。)错误。我认为我的设计不正确,因此收到这些错误。
这是我的代码的 sn-p:
case INTERNET_STATUS_REQUEST_COMPLETE:
BOOL bAllDone= FALSE;
DWORD lastError;
do
//Create INTERNET_BUFFERS
char m_pbReadBuffer[4096];
INTERNET_BUFFERS BuffersIn;
ZeroMemory(&BuffersIn, sizeof(INTERNET_BUFFERS));
BuffersIn.dwStructSize = sizeof(INTERNET_BUFFERS);
BuffersIn.lpvBuffer = m_pbReadBuffer;
BuffersIn.dwBufferLength = 4096;
InternetReadFileEx(ReqContext->File, &BuffersIn, IRF_ASYNC, 1);
//HERE I GOT THOSE 10035 and 1008 ERRORS
lastError = GetLastError();
if(lastError == 997) // handling ERROR_IO_PENDING
break;//break the while loop
//append it to my ISTREAM
(ReqContext->savedStream)->Write(BuffersIn.lpvBuffer, BuffersIn.dwBufferLength, NULL);
if (BuffersIn.dwBufferLength == 0)
bAllDone = TRUE;
while(bAllDone == FALSE);
//delete[] m_pbReadBuffer;
if(bAllDone == TRUE && lastError== 0)
//these are for passing the ISTREAM to the function which calls "InternetOpenUrl"
LARGE_INTEGER loc;
loc.HighPart = 0;
loc.LowPart = 0;
ReqContext->savedStream->Seek(loc, STREAM_SEEK_SET, NULL);
ReqContext->savedCallback->OnUrlDownloaded(S_OK, ReqContext->savedStream); //Tell silverlight ISTREAM is ready
ReqContext->savedStream->Release();
ReqContext->savedCallback->Release();
InternetCloseHandle(ReqContext->File);
InternetSetStatusCallback(ReqContext->Connection, NULL);
InternetCloseHandle(ReqContext->Connection);
delete[] ReqContext;
break;
谁能帮我纠正一下? 谢谢大家帮忙...
【问题讨论】:
【参考方案1】:GetLastError()
仅在 InternetReadFileEx()
(或任何其他 API,就此而言)实际上因错误而失败时才有意义。否则,您将处理来自早期 API 调用的错误,从而使您的代码产生错误的错觉,即错误发生了,而实际上可能没有。您必须注意 API 返回值,但您目前忽略了 InternetReadFileEx()
的返回值。
不过,更糟糕的是,您在异步模式下使用InternetReadFileEx()
,但您使用的是INTERNET_STATUS_REQUEST_COMPLETE
回调处理程序本地的接收缓冲区。如果InternetReadFileEx()
失败并出现ERROR_IO_PENDING
错误,则在后台执行读取,并在读取完成时触发INTERNET_STATUS_REQUEST_COMPLETE
。但是,当发生该错误时,您将中断循环(即使读取仍在进行中),并且该缓冲区将在读取完成之前超出范围。虽然读取仍在进行中,但接收缓冲区仍在堆栈上,InternetReadFileEx()
仍在写入它,但它可能会同时被重新用于其他事情,因为您的代码继续执行其他事情并且没有等待读取完成。
您需要重新考虑您的方法。要么:
删除 IRF_ASYNC
标志,因为这是您的其余回调代码期望 InternetReadFileEx()
的行为方式。
重新编写代码以在异步模式下正确运行。动态分配接收缓冲区(或至少将其存储在异步读取期间仍在范围内的其他位置),除非您确实有数据要写入(仅当 InternetReadFileEx()
立即返回 TRUE 时,否则不要调用 IStream::Write()
从早期的InternetReadFileEx()
/ERROR_IO_PENDING
调用中获取带有成功代码的INTERNET_STATUS_REQUEST_COMPLETE
事件,等等。
有大量在线示例和教程展示了如何在异步模式下使用 InternetReadFileEx()
。到处搜索。
【讨论】:
以上是关于InternetReadFileEx 给出 10035 和 1008 错误的主要内容,如果未能解决你的问题,请参考以下文章
React Material UI:Appbar 给出了 TypeError: Cannot read properties of undefined (reading '100')
100 个用户工作正常,对于 200 个用户,它会给出“javax.net.ssl.SSLHandshakeException”错误,并显示“握手期间远程主机关闭连接”消息
编写一个猜数的游戏程序。(数字由机器随机产生,限制为1~100之间的整数,用户输入猜测,程序给出大小提示
sql'select top 1' without 'order by' from view with 'top 100 percent ... order by ...'声明给出了意想不到的结果[重