我正在使用InternetSetStatusCallback传输数据:
BufferedReader in = new BufferedReader(new InputStreamReader(p.getErrorStream()));
有时,尽管每250毫秒发送一次流式数据,但下面的CallBack函数还是在退出之前再次被调用,因此程序应该有足够的时间来处理数据。
CallbackPointer = InternetSetStatusCallback(SessionHandle,
(INTERNET_STATUS_CALLBACK)CallBack);
因此,程序可以正确地初始化,然后获得INTERNET_STATUS_RECEIVING_RESPONSE和INTERNET_STATUS_RESPONSE_RECEIVED状态响应。到目前为止,一切都很好。但是下一次迭代出错了,InternetReadFileEx调用了两次并获取了错误消息,其中一个用于待处理的IO,一个用于内部错误,由InternetReadFileEx进行。下一轮又好,然后是错误。
我做了“ bool insideFunc”技巧,看我是否怀疑正在发生的事情,是的,有时“调用”在设置为真之前是正确的,所以有时它在结束之前就被调用了。我只想在INTERNET_STATUS_RESPONSE_RECEIVED上阅读我的消息,但有时CallBack()在完成之前会再次被调用,并且InternetReadFileEx的发生时机很差,导致返回错误代码997和12004。
该如何解决?
答案 0 :(得分:0)
我能够轻松解决此问题。问题是我在交换机的INTERNET_STATUS_RESPONSE_RECEIVED情况下保留了ReadFile()调用。之所以造成麻烦,是因为该状态是在我的ReadFile()内部的InternetReadFileEx()调用内部通过回调发送的,从而再次递归调用了ReadFile()。
因此,第一次ReadFile()调用导致997:ERROR_IO_PENDING,而第二次调用(导致但又递归)导致了12004:内部错误。
解决方案:在将我的ReadFile()移到交换机中的INTERNET_STATUS_REQUEST_COMPLETE情况下之后,由于我没有在ReadFile()中获得回调,因此我仅收到ERROR_IO_PENDING。状态。返回InternetReadFileEx()很久之后,我们异步获得此状态。 ERROR_IO_PENDING正常:
注意GetLastError代码ERROR_IO_PENDING并非失败;它指定读取操作正在异步完成等待处理。
引自https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfile
流媒体的制作者
这是Oanda流媒体的工作方式,但我想这是常见的做法?
谢谢大家的答复。