我想通过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:EinungültigesArgumentwurde 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;
}
}
答案 0 :(得分:0)
Asio的错误检测和报告是一个相当薄的层,通常传播它由底层系统调用提供的所有信息。失败如果应用程序能够接收它,Asio将填充boost::system::error_code
,例如异步操作或具有error_code
参数的同步操作重载;否则会抛出包含error_code
的异常。 documentation明确提到了异步操作,但同样的“似乎”行为通常适用于同步操作:
除非另有说明,否则当异步操作的行为被定义为“似乎”由POSIX函数实现时,将使用类型
error_code
的值调用处理程序,该值对应于POSIX描述的失败条件对于该功能,如果有的话。否则,将使用反映操作系统错误的实现定义的error_code
值调用处理程序。异步操作不会因指示信号中断的错误条件(POSIX
EINTR
)而失败。异步操作不会因与非阻塞操作(POSIXEWOULDBLOCK
,EAGAIN
或EINPROGRESS
; WindowsWSAEWOULDBLOCK
或WSAEINPROGRESS
)相关的任何错误情况而失败。< / p>
要进一步调查错误,请考虑使用BSD API mapping documentation来确定正在进行的OS调用。然后,可以使用适当的OS文档来确定发生错误的条件和值。错误代码和Boost.Asio错误代码之间的映射位于asio/error.hpp
内,但映射通常非常简单。
如果是sendto()
,则返回值EINVAL
可能无法提供深刻见解的信息。可以通过附加调试器并在Asio制作system call to sendto()
时检查有效性的参数来进一步诊断问题。