2010-08-02 88 views
1

我需要在使用boost ASIO编写的UDP服务器中获取数据报的源IP。 在示例udp数据报服务器行中:如何使用Boost ASIO在UDP服务器中传递源IP

注意:我当前的代码与boost asio文档中现有的udp async服务器示例相同。

socket_.async_receive_from(
     boost::asio::buffer(data_, max_length), sender_endpoint_, 
     boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 

传递错误和bytes_transferred。我还需要邮件的地址。

现在我知道我可以直接使用sender_endpoint_.address()。to_string(),但我想通过它作为参数。

所以我试着将sender_endpoint_.address()放入参数中。 即

socket_.async_receive_from(
     boost::asio::buffer(data_, MAX_LENGTH), sender_endpoint_, 
     boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred, 
        sender_endpoint_.address())); 

但结果是从0.0.0.0读handle_receive_from时。 但是,如果我只是访问handle_receive_from 内的sender_endpoint_.address(),那么我得到127.0.0.1,这是正确的。

如何正确传递?我需要这个,因为会有多个线程调用io_service.run(),所以来自另一个源的数据包可能会覆盖sender_endpoint,并且我需要能够回复该源数据包。

+0

你可以发布你的'服务器'类的代码吗? – 2010-08-02 15:00:48

+0

目前它与async udp服务器示例相同。 – Matt 2010-08-02 22:01:17

回答

0

认为如果您在您的处理程序中访问sender_endpoint_.address(),然后再设置另一个异步处理程序,它会很好,并且不会被覆盖。你在处理程序中再次调用async_receive_from,准备好接收另一个数据包?

在您尝试sender_endpoint_.address()作为参数的第二个代码块中,当设置处理程序时,sender_endpoint_.address()会被调用,而在接收到数据包时不会由处理程序执行。这就是为什么它总是0.0.0.0。

+0

谢谢,我确实想到了这一点,但没有在这里添加任何东西。 – Matt 2010-12-13 19:41:30

+0

UDP在这个封装的IP地址中有一个伪头。我不知道如何通过Boost.Asio访问它。但是,*端口*是您需要知道发件人的信息。 – 2015-06-22 18:11:41

相关问题