- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将完整的数据包发送到特定的 IP 地址。关键是我已经有了完整的数据包二进制文件,我不想将它封装到任何额外的数据包 header 中。这是我的逻辑:
std::string destination_ip = "127.0.0.1";
uint16_t destination_port = 8080;
int socket_fd;
struct sockaddr_in socket_attrs;
if ((socket_fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0)
{
printf("Socket creation error\n");
return false;
}
memset(&socket_attrs, '0', sizeof(socket_attrs));
socket_attrs.sin_family = AF_INET;
socket_attrs.sin_port = htons(destination_port);
if(inet_pton(AF_INET, destination_ip.c_str(), &socket_attrs.sin_addr)<=0)
{
printf("Invalid IP address/ IP address not supported\n");
return false;
}
if (connect(socket_fd, (struct sockaddr *)&socket_attrs, sizeof(socket_attrs)) < 0)
{
printf("Connection Failed\n");
return false;
}
if((write(socket_fd , <PACKET_DATA> , <PACKET_SIZE>)) < 0){
std::cout << "Error sending packets to the network" << std::endl;
exit(1);
}
输出:
Connection Failed
谁能帮我实现我的目标?
最佳答案
使用libpcap
, pcap_inject()特别是。
你不能使用 socket()
,也不能使用 IPPROTO_RAW
,因为 L2(eth) 和 L3(ip) 将由操作系统的 IP 堆栈伪造案例太。
您需要将数据包直接注入(inject)网卡。如果您希望将其传送到与原始 IP 不同的 IP,则必须“编辑”数据包内容。
从此处粘贴的示例:http://www.microhowto.info/howto/send_an_arbitrary_ethernet_frame_using_libpcap.html
char pcap_errbuf[PCAP_ERRBUF_SIZE];
pcap_errbuf[0]='\0';
pcap_t* pcap=pcap_open_live(if_name,65536,0,0,pcap_errbuf);
if (pcap_errbuf[0]!='\0') {
fprintf(stderr,"%s",pcap_errbuf);
}
if (!pcap) {
exit(1);
}
if (pcap_inject(pcap, <PACKET_DATA> , <PACKET_SIZE> )==-1) {
pcap_perror(pcap,0);
pcap_close(pcap);
exit(1);
}
pcap_close(pcap)
如果您不想编辑 IP 目的地,只有在两个对等点之间没有交换机/路由器时,数据包才能到达线路的另一端。
作为替代方案,OP 建议使用隧道。它确实有效(我使用 tcpreplay
对其进行了测试)- 您可以使用 GRE 隧道,它实际上也可以传输以太网流量。
在两个对等点上,您可以建立一个gretap 隧道。我使用了这些命令:
在主机 A 上(其 IP 地址为 192.168.1.211):
ip link add gretap1 type gretap local 192.168.1.211 remote 192.168.1.64
ip link set gretap1 up
在主机 B 上(其 IP 地址为 192.168.1.64):
ip link add gretap1 type gretap local 192.168.1.64 remote 192.168.1.211
ip link set gretap1 up
此时可以使用 L2 GRE 隧道并让它使用 gretap1 接口(interface)传输 ETH 流量。在一个对等节点上,我使用以下命令将流量注入(inject)隧道:
tcpreplay -i gretap1 test.pcap
并且在另一个节点上使用 wireshark 或 tcpdump 在 gretap1 接口(interface)上验证流量已传输并捕获它。
不幸的是,此设置存在一个问题:隧道的 MTU 小于网络的 MTU,因此不能保证您可以重放所有数据包。
关于c++ - 使用 C++ 将完整的以太网数据包发送到特定的 ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54109154/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!