- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 libnet 库构建一个 TCP
数据包。我在 libnet_build_tcp
函数中使用 '0'
自动计算校验和值。但是,校验和似乎在计算时忽略了 pseudo-header
,由于校验和错误导致无用的数据包。有谁知道如何解决这个问题?
最佳答案
据我在代码中看到的,只要你没有使用过libnet_toggle_checksum(l, ptag, 1);
你的0
在sum
libnet_build_tcp()
的参数应该通过调用 libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM)
使其自动为您计算校验和.
我真的不能告诉你如何解决它,但既然你是构建数据包的人,也许你可以选择创建自己的校验和?
TCP 伪报头是一个 12 字节的字段,包含源 IP 地址和目标 IP 地址(均为 4 字节)、一个 2 字节且始终设置为零的保留字段,以及一个 4 字节的 TCP 段长度,该段长度等于TCP header 的大小 + 有效负载长度。
你可以创建这样的东西:
首先创建你的变量:
int bytesRead;
int pseudoHeaderLength;
int payloadLength;
int tcpHdrLength;
int tcpSegmentLength;
int ipHdrLength;
int headerLengths;
int ethIPHdrLengths;
struct ethhdr *ethHdr;
struct iphdr *ipHdr;
struct tcphdr *tcpHdr;
u_int8_t *pkt_data;
u_int8_t pseudoHeader[12];
u_int8_t packetBuffer[1600];
u_int16_t newChecksum;
然后创建实际函数,其中 b->len 是数据包的总大小(只需添加所有 header + 有效负载并获得总大小),您只需将 header 和数据 memcpy 到 pkt_data:
ethHdr = (struct ethhdr*)pkt_data;
ipHdr = (struct iphdr*)(pkt_data + ETH_HLEN);
ipHdrLength = ipHdr->ihl * 4;
ethIPHdrLengths = ETH_HLEN + ipHdrLength;
tcpHdr = (struct tcphdr*)(pkt_data + ethIPHdrLengths);
tcpHdrLength = tcpHdr->doff * 4;
headerLengths = ethIPHdrLengths + tcpHdrLength;
payloadLength = b->len - headerLengths;
tcpSegmentLength = tcpHdrLength + payloadLength;
pseudoHeaderLength = tcpSegmentLength + 12;
pseudoHeader[0] = pkt_data[30];
pseudoHeader[1] = pkt_data[31];
pseudoHeader[2] = pkt_data[32];
pseudoHeader[3] = pkt_data[33];
pseudoHeader[4] = pkt_data[26];
pseudoHeader[5] = pkt_data[27];
pseudoHeader[6] = pkt_data[28];
pseudoHeader[7] = pkt_data[29];
pseudoHeader[8] = 0x00;
pseudoHeader[9] = 0x06;
pseudoHeader[10] = (tcpSegmentLength >> 8) & 0xFF;
pseudoHeader[11] = tcpSegmentLength & 0xFF;
bytesRead = 0;
for(i = 0; i < 12; i++) {
packetBuffer[bytesRead] = pseudoHeader[i];
bytesRead++;
}
for(i = ethIPHdrLengths; i < headerLengths; i++) {
packetBuffer[bytesRead] = pkt_data[i];
bytesRead++;
}
for(i = b->len - payloadLength; i < b->len; i++) {
packetBuffer[bytesRead] = pkt_data[i];
bytesRead++;
}
newChecksum = checksum((uint16_t *)packetBuffer, pseudoHeaderLength);
只需使用 https://www.rfc-editor.org/rfc/rfc1071 提供的校验和功能即可计算缓冲区的校验和:
uint16_t checksum(uint16_t *addr, int len)
{
int count = len;
register uint32_t sum = 0;
uint16_t answer = 0;
while (count > 1) {
sum += *(addr++);
count -= 2;
}
if (count > 0) {
sum += *(uint8_t *) addr;
}
while (sum >> 16) {
sum = (sum & 0xffff) + (sum >> 16);
}
answer = ~sum;
return (answer);
}
我在现实环境中使用它来计算 500 万 PPS 的校验和。
关于c - Libnet TCP 校验和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7871285/
安装 libnet1-dev 后,通过问题“libnet-config --defines”检查配置设置,但无法找到“-DLIBNET_LIL_ENDIAN”标志。 libnet-config --d
当我通过 sudo apt-get install libnet1 安装 libnet 时,程序找不到 libnet.h,我在/usr/local/include 或/usr/include 也找不到
因此,我正在尝试使用命令“gcc -o file file.c”编译我的 C 代码,但我得到“错误:libnet.h:没有这样的文件或目录”我包含了 libnet.h (# include ) 并且我
我正在尝试使用 libnet 库构建一个 TCP 数据包。我在 libnet_build_tcp 函数中使用 '0' 自动计算校验和值。但是,校验和似乎在计算时忽略了 pseudo-header,由于
我用libnet写了一个demo,调用函数的时候报错: libnet_error(LIBNET_ERR_FATAL, "libnet_open_link_interface: %s\n", errbu
我编写了一个 C 程序,用于从链路层向上创建 TCP/IPv4 数据包。该程序的目标是通过开放套接字(原始套接字或流套接字)接收单个数据包。该数据包由以太网 header 、tcp header 和
我正在使用 libnet 和 pcap 编写几行 C 代码。 目的是进行 3 次握手,手动嗅探 NIC 上的过滤流量,查找 SYN 数据包并使用原始 ipv4 套接字创建 SYN-ACK 响应。 我使
是否可以使用 Libnet 读取 ARP 响应?我正在寻找一个跨平台库来读取用 C/C++ 编写的 ARP 套接字 最佳答案 libnet 是一个用于可移植数据包构造和注入(inject)的库。消费和
我需要更有经验的网络程序员的意见/建议,了解一些关于 GNU/Linux 系统上的数据包注入(inject)的东西。我正在开发一个用于数据包注入(inject)和嗅探的开源 C++ 库。图书馆是lib
我正在使用 pylibnet 构建和发送 UDP 数据包。我用这种方式构造的 UDP 数据包似乎都有无效的校验和。示例: # python Python 2.4.3 (#1, Sep 3 2009,
我正在使用一个使用 libnet 的程序,每次我使用它时,libnet 都无法发送任何数据包。 具体来说,失败的函数是:libnet_write_ip。它在每次调用时返回 -1。 有什么想法可能导致这
我正在尝试构建 this我的 eclipse 项目。它使用 libnet 库,所以我安装了 libnet-dev在我的 ubuntu 上。 但是,我在 arp.h 中仍然没有出现此类文件或目录错误。
我想在一台服务器上抓取ip包,然后通过libnet将包转发到另一台服务器,谁有一些例子?提前致谢。 最佳答案 查看这些教程: Programming with pcap Libnet 1.1 tuto
我尝试在我的 Opensuse OS 中运行 Python 程序,该程序使用 libnet 和 pcap。 import queue import sys import socket import l
我正在开发一个系统,它可以检测本地网络中的请求。如果客户请求某个站点,系统将发送一个http重定向数据包。我通过libnet构建http重定向数据包,在Location中设置新的uri,例如: HTT
我只是看了一眼libnet的介绍, 似乎提到了支持udp、ip,但没有提到tcp? 它支持tcp吗? 最佳答案 寻找here ,好像有一个与tcp相关的功能,所以我想是的,你可以用libnet注入(i
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我在终端中的 Depends: 之后不断收到这些信息。 libnet-server-perl but it is not installable 和 libipic-shareable-perl bu
恐怕我的问题可能很愚蠢,但由于我是 kdevelop 和 cmake 的新手,所以我很难理解它们是如何工作的。我尝试设置的项目使用 libnet 1.1 库。我的问题是如何让 cmake 编译和链接这
我试图让 libpcap 读取一个 pcap 文件,让用户选择一个数据包并使用 libnet 在 c 中写入该数据包。 我完成了文件读取部分。 Libpcap 将该数据包放入一个 const unsi
我是一名优秀的程序员,十分优秀!