c++ - TCPdump 在接收数据包时是否去除任何 header ?

标签 c++ c posix tcp raw-sockets

所以我试图通过 RAW 套接字接口(interface)发送一个已经构建的数据包(这些数据包是以前捕获的,我想在不改变数据包完整性的情况下重新发送它们)并且我正在使用 TCPdump 检查数据包是否正在运行过度正确(他们没有感到惊讶)。

数据包实际上正在发送,但总是比我“发送”返回的内容少 24 个字节。

在 wireshark 中,我的 eth header 似乎被删除了,因为我的源和目标 MAC 地址是“00:00:00:00:00

socks 设置如下

sock = socket(AF_PACKET,SOCK_RAW,IPPROTO_RAW);
if(sock==-1)
{
    qDebug() << "sock error";
}

int reuse = 1;

if(setsockopt(sock, IPPROTO_RAW, IP_HDRINCL, (char *)&reuse, sizeof(reuse)) < 0)
{
    qDebug() << "error setting reuse"
}
else
{
    "setting reuse"
}

struct sockaddr_ll sll;
struct ifreq ifr;

bzero(&sll, sizeof(sll));
bzero(&ifr, sizeof(ifr));

sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(IPPROTO_RAW);
sll.sll_halen = ETH_ALEN;

strncpy((char*)ifr.ifr_ifrn.ifrn_name,interface.toUtf8.constData(),IFNAMSIZ);
if(ioctl(sock,SIOCGIFINDEX,&ifr) == -1)
{
   qDebug() << "error getting interface name";
}
strncpy((char*)ifr.ifr_ifrn.ifrn_name,interface.toUtf8.constData(),IFNAMSIZ);
if(ioctl(sock,SIOCGIFHWADDR,&ifr) == -1)
{
   qDebug() << "error getting interface name";
}

if(bind(sock,(struct sockaddr *)&sll,sizeof(sll))==-1)
{
   qDebug() << "error binding sock";
}

在我使用之后

int size = write(sock,(const void*)&packet,hdr.caplen);

我过去曾尝试过 sendto,但它总是会重新配置,所以这是我的下一个解决方案,但也无法正常工作。

我不是最懂 TCP/IP 的东西所以任何帮助将不胜感激!

最佳答案

好吧,在尝试了一堆不同的东西之后,我找到了我的解决方案。

我创建了第二个指针,它将指向数据包的顶部并改为发送它。

(char *)sendingPacket;
struct ethhdr *ethh = (struct ethhdr*)packet;
sendingPacket = (char*) ethh;

我真的不明白为什么这行得通,但是发送另一个数据包却行不通,所以如果有人有见识请分享!

关于c++ - TCPdump 在接收数据包时是否去除任何 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53396869/

相关文章:

c - C 中的魔法与 malloc、fork 和 open

c - C语言和冯诺依曼体系结构有什么关系?

c++ - pthread 在预期之后执行

linux - 我的所有 inode 都在哪里使用?

c - 在磁盘上分配文件而不清零

c++ - 有没有一些方法可以更改 Qt Creator 语法突出显示的设置?

c++ - 在嵌入式 Linux 中调度文件操作

C++ 抛出未知异常类型,但仅在生产构建中

c - GCC无法编译程序

c++ - 按名称链接导入 (C++/Visual Studio)