Boost ASIO 中的拍卖

Posted

技术标签:

【中文标题】Boost ASIO 中的拍卖【英文标题】:Auctions in Boost ASIO 【发布时间】:2020-10-19 10:12:31 【问题描述】:

我正在使用 Boost.Asio 用 C++ 实现一个拍卖系统。有一个集中的拍卖师(服务器)和一些连接的投标人(客户)。我正在以异步方式实现这一点,并且我已经实现了投标人和拍卖人之间的基本通信(注册、ping、获取客户列表)。拍卖师的基本代码如下所示:

class talkToBidder : public boost::enable_shared_from_this<talkToBidder>

// Code for sending and receiving messages, which works fine
;

void on_round_end()

  // Choose the best bid and message the winner
  
  if (!itemList.empty())
    timer_reset();


void timer_reset()

  // Send the item information to the bidders

  // When the round ends, call on_round_end()
  auction_timer.expires_from_now(boost::posix_time::millisec(ROUND_TIME));
  auction_timer.async_wait(boost::bind(on_round_end));


void handle_accept(...)

  // Create new bidder...

  acceptor.async_accept(bidder->sock(),boost::bind(handle_accept,bidder,_1));



int main()

  // Create new bidder and handle accepting it
  talkToBidder::ptr bidder = talkToBidder::new_();
  acceptor.async_accept(bidder->sock(),boost::bind(handle_accept,bidder,_1));

  service.run();

我的问题是,我需要等待至少一个投标人连接才能开始拍卖,所以在使用 service.run() 之前我不能简单地调用timer_reset()。 Boost.Asio 的方法是什么?

【问题讨论】:

猜测这段代码应该做什么有点棘手?这是多轮同时竞价拍卖?计时器是每轮计时器?如果是这样,您是第一轮的问题,还是所有轮的问题? 对不起,如果不清楚,我会添加任何需要的细节。本次拍卖为多轮盲注。每一轮,拍卖师都会将一件物品的详细信息发送给注册的投标人,投标人会以他们的出价作为回应。该回合在一定时间后结束,拍卖师宣布出价最高的人为获胜者(通过向其发送消息)。这种情况一直持续到所有物品都被拍卖。我的问题是第一轮(将产生连续的轮次)。我怎样才能让它异步等待一个条件(至少一个投标人)? 好的,您使用的术语有些不寻常。诺贝尔经济学奖最近因有关多轮拍卖的理论而获奖。这些是同一项目有多个轮次的拍卖,通常有相同的投标人。似乎每件商品都有一轮竞标?但是投标人可以在项目之间加入和离开吗?这意味着bidders==0 的情况也可能发生在项目/回合之间。 其实我正在尝试实现this paper。我试图解释用例而不涉及论文中的确切术语,因为它会更清楚,但似乎我失败了:)。你是对的,这是可能发生的情况,但我认为如果我得到启动它的想法,我可以解决任何其他问题。感谢您的帮助! 【参考方案1】:

在异步协议设计中,绘制消息序列图很有帮助。 Do include your timers.

代码现在变得微不足道。当应该启动计时器的消息到达时,您启动计时器。是的,这将问题向前转移了一点。这里真正的重点是它不是 Boost Asio 编码问题。在您的情况下,该特定消息似乎是第一个投标人的登录信息,实现为 TCP 连接 (SYN/ACK),它映射到您的代码中的 handle_accept

【讨论】:

我试图将一些额外的代码硬塞到预先存在的代码中,并且肯定认为它的方向是错误的,这是非常微不足道的。感谢您的帮助!

以上是关于Boost ASIO 中的拍卖的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误

boost::asio 中的 NAT 打孔

strand 在 boost asio 中的优势是啥?

Boost asio 中的 TCP 客户端

Boost::ASIO HTTP POST 中的空正文

如何确定是不是有数据可从 boost::asio 中的套接字读取?