流错误:退出上一个调用之前,再次调用InternetSetStatusCallback

时间:2019-02-15 15:22:34

标签: c++ http winapi https

我正在使用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。

该如何解决?

1 个答案:

答案 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

流媒体的制作者

  1. 调用InternetReadFileEx()
  2. 它返回一个未决的IO
  3. 当它有新数据(价格)时,它只是通过INTERNET_STATUS_REQUEST_COMPLETE异步发送。
  4. 如果几秒钟没有任何数据(价格没有变化),它只会通过INTERNET_STATUS_REQUEST_COMPLETE发送心跳信号,以避免超时。
  5. 收到数据后,我立即再次调用InternetReadFileEx()(请参阅#1)

这是Oanda流媒体的工作方式,但我想这是常见的做法?

谢谢大家的答复。