首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强asio原始套接字

增强asio原始套接字
EN

Stack Overflow用户
提问于 2011-11-06 02:53:04
回答 3查看 3.8K关注 0票数 3

我正在尝试用asio编写一个简单的数据包制作程序。我需要通过不同的协议发送原始数据。

我正在尝试更改asio文档中的ping示例。在本例中,icpm数据包是通过socket_.send_to方法发送的。此方法将icmp数据包封装为ip数据包。

但我需要发送ip报头,然后是icmp报头,然后是没有任何封装的数据包正文!我正在尝试使用socket.send方法来完成此任务。但是它抛出了一个异常。

这是代码。在我的班上,我有:

代码语言:javascript
复制
boost::asio::basic_raw_socket<raw> socket_;

当' raw‘是原始数据协议的类时。这个类类似于来自asio的protocol_等于IPPROTO_RAW的'icmp‘类。

然后我发送数据:

代码语言:javascript
复制
     IPV4header ip_header;
 //fill ip_header

 ICMPHeader echo_request;
 //fill icmp-header

 std::string body("---");

 // Encode the request packet.
 boost::asio::streambuf request_buffer;
 std::ostream os(&request_buffer);
 os << ip_header << echo_request << body;

 socket_.send(request_buffer.data(), request_buffer.size());
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-12 18:55:29

使用setsockopt将value IPPROTO_IP IP_HDRINCL设置为0。这应该会有帮助

票数 2
EN

Stack Overflow用户

发布于 2012-07-30 11:47:01

我不相信你可以使用Asio原始套接字或Asio库来发送这样的IP报头。此外,您还需要指定一个目的地端点,如果您试图在没有首先连接的情况下通过套接字发送数据,则需要使用send_to()方法,而不是使用send()方法。

我创建了一个github存储库,其中包含如何使用具有自定义传输层头的Asio套接字的示例:https://github.com/kevincon/asio-rawsockets-example

如果您希望发送自己的IP报头,可以研究一下libpnet6:http://pnet6.sourceforge.net/的数据包注入功能

票数 2
EN

Stack Overflow用户

发布于 2016-12-21 17:14:53

“使用setsockopt将IPPROTO_IP IP_HDRINCL的值设置为0。这应该会有帮助”,

如果需要发送不带任何封装ip报头,则应将IPPROTO_IP IP_HDRINCL设置为1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8022452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档