如何通过 boost::asio 从send_to获取特定的错误详细信息?

How do I get specific error details from send_to by boost::asio?

本文关键字:错误 详细信息 获取 boost 何通过 asio send to      更新时间:2023-10-16

我想通过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

英文翻译:"使用了无效的参数"

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

如何从 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;
}
}

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

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

异步操作不会失败,并显示指示信号中断的错误条件 (POSIXEINTR)。异步操作不会因与非阻塞操作(POSIXEWOULDBLOCKEAGAINEINPROGRESS相关的任何错误条件而失败;视窗WSAEWOULDBLOCKWSAEINPROGRESS)。

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

sendto()的情况下,返回值EINVAL可能不会提供有见地的信息。 可以通过附加调试器并在 Asio 对sendto()进行系统调用时检查有效性参数来进一步诊断问题。