C++ 检查服务器是否在超时后收到数据
我制作了一个程序,使用了比特币交易所的多个RestAPI,例如 有一个功能允许我进行交易:以特定价格出售或购买比特币。简化后,您必须使用如下参数调用URL:C++ 检查服务器是否在超时后收到数据,c++,asp.net-web-api,libcurl,C++,Asp.net Web Api,Libcurl,我制作了一个程序,使用了比特币交易所的多个RestAPI,例如 有一个功能允许我进行交易:以特定价格出售或购买比特币。简化后,您必须使用如下参数调用URL: https://www.bitstamp.net/api/trade?price=100&amount=1&type=sell 然后服务器用JSON应答。例如: {"error":"","message":"Sold 1 BTC @ 100$"} 如果交易成功,我的计划将继续。如果不是,它将重试(取决于错误消息) 然而,
https://www.bitstamp.net/api/trade?price=100&amount=1&type=sell
然后服务器用JSON应答。例如:
{"error":"","message":"Sold 1 BTC @ 100$"}
如果交易成功,我的计划将继续。如果不是,它将重试(取决于错误消息)
然而,有一个问题。我使用libcurl与服务器通信,并将CURLOPT_超时设置为2秒。它几乎总是有效的,但有时会出现以下错误:
Code #28: Operation timed out after 2000 milliseconds with 0 bytes received
当这种情况发生时,我的程序会再次尝试交易。但有时,尽管超时,交易已经完成,这意味着由于我的代码再次尝试,交易已经完成了多次
我能找出服务器是否至少收到了所有数据吗?问题是,如果我将CURLOPT_TIMEOUT增加到10秒,而服务器没有响应,我也会遇到同样的问题。所以这不是一个解决方案。我不知道Bitstamp的详细信息,但下面是HTTP的工作原理。客户端向服务器发送请求并接收响应。在响应中,描述了成功或失败的详细信息(使用HTTP错误代码)。但是,如果收到超时,则客户端没有关于其请求的信息:
- 是否发送到服务器李>
- 服务器是否收到它李>
- 如果服务器收到请求,它是否处理了请求李>
- 服务器可能已处理该请求,但由于网络问题,发送回响应失败
也许您应该检查给定的REST API是否为事务提供了一些状态。您应该等待HTTP响应,以便更确定您的请求是否已成功处理 如果可以访问文件描述符,可以使用
SIOCOUTQ
(Linux)或FIONWRITE
(BSD)调用ioctl()
,在完全中止连接之前,在套接字级别检查未确认的发送数据
问题是它也不是完全没有错误的。即使TCP在传输级别是有状态的,HTTP在应用程序级别也是无状态的。如果您的应用程序需要事务性行为(毕竟您是在处理货币,不是吗?),那么它应该提供一种实现这一点的方法
尽管如此,我认为两秒钟可能太少了。如果需要多个操作或类似的操作需要速度,请考虑并行化连接。