【问题标题】:Does TCPdump strip any headers when receiving packets?TCPdump 在接收数据包时是否会剥离任何标头?
【发布时间】:2019-04-23 03:00:40
【问题描述】:

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

数据包正在物理发送,但总是比我的“发送”返回的数据少 24 个字节。

在 Wireshark 中,我的 eth 标头似乎已被删除,因为我的源 MAC 地址和目标 MAC 地址是“00:00:00:00:00”

袜子设置如下

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 的东西,所以任何帮助都将不胜感激!

【问题讨论】:

    标签: c++ c posix tcp-ip raw-sockets


    【解决方案1】:

    好的,所以在尝试了一堆不同的东西之后,我找到了似乎是我的解决方案。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2015-12-31
      • 2010-09-26
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多