C++ 检查服务器是否在超时后收到数据

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$"} 如果交易成功,我的计划将继续。如果不是,它将重试(取决于错误消息) 然而,

我制作了一个程序,使用了比特币交易所的多个RestAPI,例如

有一个功能允许我进行交易:以特定价格出售或购买比特币。简化后,您必须使用如下参数调用URL:

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错误代码)。但是,如果收到超时,则客户端没有关于其请求的信息:

  • 是否发送到服务器
  • 服务器是否收到它
  • 如果服务器收到请求,它是否处理了请求
  • 服务器可能已处理该请求,但由于网络问题,发送回响应失败
因此,不应计算请求是否成功,而应重新发送请求。您所描述的问题当然是可能的——服务器收到了请求,处理了请求,但没有发送回响应。出于这个原因,应该使用其他更复杂的协议,不幸的是HTTP不是其中之一,因为它的请求-响应特性


也许您应该检查给定的REST API是否为事务提供了一些状态。

您应该等待HTTP响应,以便更确定您的请求是否已成功处理

如果可以访问文件描述符,可以使用
SIOCOUTQ
(Linux)或
FIONWRITE
(BSD)调用
ioctl()
,在完全中止连接之前,在套接字级别检查未确认的发送数据

问题是它也不是完全没有错误的。即使TCP在传输级别是有状态的,HTTP在应用程序级别也是无状态的。如果您的应用程序需要事务性行为(毕竟您是在处理货币,不是吗?),那么它应该提供一种实现这一点的方法

尽管如此,我认为两秒钟可能太少了。如果需要多个操作或类似的操作需要速度,请考虑并行化连接。