Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinHTTP:如何强制关闭连接?_C++_Sockets_Delphi_Winhttp_Binance - Fatal编程技术网

C++ WinHTTP:如何强制关闭连接?

C++ WinHTTP:如何强制关闭连接?,c++,sockets,delphi,winhttp,binance,C++,Sockets,Delphi,Winhttp,Binance,在使用WinHTTP处理Binance REST API时,我注意到请求有时会失败并出现错误 12030 the connection with the server was terminated abnormally 每个请求都是这样提出的:(完整示例) 然而,尽管我关闭了句柄,连接还是被重用(我在HttpAnalyzer中看到) 我想这就是问题所在:根据服务器的保持活动设置,服务器在N个请求或秒后开始断开连接;同时,我的客户机启动了新的请求,但以12030失败 而且。在检查成功的请求头时,

在使用WinHTTP处理Binance REST API时,我注意到请求有时会失败并出现错误

12030 the connection with the server was terminated abnormally
每个请求都是这样提出的:(完整示例)

然而,尽管我关闭了句柄,连接还是被重用(我在HttpAnalyzer中看到)

我想这就是问题所在:根据服务器的保持活动设置,服务器在N个请求或秒后开始断开连接;同时,我的客户机启动了新的请求,但以12030失败

而且。在检查成功的请求头时,我注意到

Connection: Close
不时从服务器传递;在这种情况下,我想重新连接

问题是:如何防止WInHTTP尝试重用即将被服务器丢弃的连接

更改注册表“TcpTimedWaitDelay”参数将不会有效,因为每次的请求计数可能会有所不同

Delphi TNetHTTPClient(使用WinHTTP)和Indy TIdHTTP也有同样的问题

对于Indy,释放TIdHTTP对象不会关闭连接;然而,在这种情况下,我们有源代码。
IdSSLOpenSSL.pas
中的以下修补程序解决了此问题:

If SSL_shutdown(fSSL) = 0
  then SSL_shutdown(fSSL);
//    SSL_shutdown(fSSL); <= was in original Indy10 IdSSLOpenSSL
如果SSL_关闭(fSSL)=0
然后关闭SSL_(fSSL);

//SSL_关机(fSSL);“至于Indy,释放TIdHTTP对象不会关闭连接”-是的,它会关闭,因为套接字被
TIdHTTP
的析构函数关闭(如果它仍然打开)。好吧,WinHTTP没有任何控制连接重用的标志(WinInet有,尽管它们是用于启用重用的,而不是禁用它)。您可以尝试手动使用将
连接:close
头添加到HTTP请求中,这将指示服务器在发送响应后关闭连接。您可以通过
TIdHTTP.Request.Connection
属性在
TIdHTTP
中执行相同的操作。@RemyLebeau谢谢,确实,TIdHTTP确实关闭了连接。我首先在httpAnalyzer中观察到它,不需要第二次SSL_关闭。因此,唯一的断开连接的方法是使用TIdHTTP-如果客户机在请求中发出
连接:关闭
,则
连接:关闭
头不起作用,因为可能会导致相同的问题(至少对于binance API:)-服务器在客户机发出新请求时关闭连接…根据HTTP规范,服务器需要在响应中发出相同的消息,并在发送响应后实际关闭其连接端。无论请求如何,如果服务器发送
连接:关闭
,则客户端需要在收到响应后实际关闭其连接端。我发现WinHTTP不太可能不能正确执行此操作。“至于Indy,释放TIdHTTP对象不会关闭连接”-是的,它会关闭,因为套接字被
TIdHTTP
的析构函数关闭(如果它仍然打开)。好吧,WinHTTP没有任何控制连接重用的标志(WinInet是这样做的,尽管它们是用于启用重用,而不是禁用它)。您可以尝试手动使用将
连接:close
头添加到HTTP请求中,这将指示服务器在发送响应后关闭连接。您可以通过
TIdHTTP.request.Connection
属性在
TIdHTTP
中执行相同的操作。@RemyLebeau谢谢,的确,TIdHTTP确实关闭了e连接。我首先在httpAnalyzer中观察到它,不需要第二次SSL_关闭。因此,唯一的断开连接的方法是使用TIdHTTP,-
连接:close
头不起作用,因为可能会导致相同的问题(至少对于binance API:)-服务器在客户端发出新请求时关闭连接…根据HTTP规范,如果客户端在请求中发出
连接:关闭
,则服务器需要在响应中发出相同的连接,并在发送响应后实际关闭其连接端。无论请求如何,如果服务器发送
连接:关闭
,客户端需要在收到响应时实际关闭其连接端。我发现WinHTTP不太可能不正确地执行此操作。
If SSL_shutdown(fSSL) = 0
  then SSL_shutdown(fSSL);
//    SSL_shutdown(fSSL); <= was in original Indy10 IdSSLOpenSSL