【问题标题】:How do I get specific error details from send_to by boost::asio?如何通过 boost::asio 从 send_to 获取特定的错误详细信息?
【发布时间】:2016-06-13 08:13:05
【问题描述】:

我想通过 boost::asio 原始套接字发送 TCP 消息。 我的数据包基于此来源:https://github.com/pfpacket/SYN-flood

我检查了 IP 和 TCP 数据包生成器的二进制输出,这些消息看起来有效。 TCP 的原始套接字函数看起来也不错。

45 10 00 28 00 00 40 00
40 06 A5 18 08 08 08 08
0B 0B 07 01 11 AD 15 B3
00 00 17 AA 00 00 00 00
50 02 10 00 3E BD 00 00

无论如何,如果我通过 send_to 函数将其发送到套接字,我会收到错误:

send_to: Ein ungültiges Argument wurde angegeben

英文翻译:“Used a non valid argument”

我不知道哪里有问题。我需要有关相关问题的更多详细信息。

如何从 send_to() 接收更具体的错误消息?下一步我能做什么?

int main() {

this->port = "5555";
this->target = "11.11.7.1";

try {

    boost::asio::io_service io_service;
    raw_tcp::socket socket(io_service, raw_tcp::v4());  

    socket.set_option(boost::asio::ip::ip_hdrincl(true));
    raw_tcp::resolver resolver(io_service); 

    raw_tcp::resolver::query query( this->target , boost::lexical_cast< std::string >(  this->port ));
    raw_tcp::endpoint destination = *resolver.resolve( query ); 

    boost::asio::streambuf request_buffer;
    std::ostream os(&request_buffer);

    //creates the ipheader and tcp packet and forward it to buffer os
    set_syn_segment(os);

    socket.send_to(request_buffer.data(), destination);         

    } catch (std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
}

【问题讨论】:

    标签: c++ sockets visual-c++ boost boost-asio


    【解决方案1】:

    Asio 的错误检测和报告是一个相当薄的层,通常传播它已由底层系统调用提供的所有信息。如果应用程序能够接收到失败,Asio 将填充 boost::system::error_code,例如异步操作或使用 error_code 参数的同步操作重载;否则它将抛出一个包含error_code 的异常。 documentation 明确提到了异步操作,但同样的 “好像” 行为通常适用于同步操作:

    除非另有说明,否则当异步操作的行为被定义为“好像”由 POSIX 函数实现时,将使用类型为 error_code 的值调用处理程序,该值对应于 POSIX 描述的失败条件功能,如果有的话。否则,将使用反映操作系统错误的实现定义的 error_code 值调用处理程序。

    异步操作不会因指示信号中断的错误条件而失败 (POSIX EINTR)。异步操作不会因与非阻塞操作相关的任何错误条件而失败(POSIX EWOULDBLOCKEAGAINEINPROGRESS;Windows WSAEWOULDBLOCKWSAEINPROGRESS)。

    要进一步调查错误,请考虑使用BSD API mapping documentation 来确定正在执行哪些操作系统调用。然后可以使用适当的操作系统文档来确定发生错误的条件和值。错误代码和 Boost.Asio 错误代码之间的映射位于 asio/error.hpp 内,但映射通常相当简单。

    对于sendto(),返回值EINVAL 可能无法提供有洞察力的信息。当 Asio 生成 system call to sendto() 时,可以通过附加调试器并检查参数的有效性来进一步诊断问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 2012-06-20
      • 2016-02-08
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      相关资源
      最近更新 更多