C创建原始UDP数据包

时间:2018-07-20 05:46:50

标签: c sockets libpcap packets

我对创建DNS(使用UDP协议发送)响应数据包感兴趣,但是我发现如何创建自己的数据包的信息有限。

大多数教程都像https://opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/

它们使用结构填充字段并将它们连接为1个序列。但是我担心编译器可以填充该结构,从而使其“损坏”(使数据包的长度超出应有的长度)

我完全知道有结构属性,不允许编译器填充结构,但我不想使用它们

谁能给我一些有关数据包创建的资源。我可以使用Libpcap和原始套接字

1 个答案:

答案 0 :(得分:0)

您这样做:

// helper function to add uint32_t to a buffer
char *append_uint32(char *buf_position, uint32_t value) {
  // network protocols usually use network byte order for numbers,
  // htonl is POSIX function so you may have to make your own on other platform
  // http://pubs.opengroup.org/onlinepubs/9699919799/functions/htonl.html
  value = htonl(value);
  memcpy(buf_postion, &value, sizeof value);
  return buf_position + sizeof value;
}

// example code using the function:
// generate packet with numbers 0...9 in network byte order
void func() {
  char buf[sizeof(int32_t) * 10];
  char *bptr = buf;
  for(uint32_t i=0; i<10; ++i) {
    bptr = append_uint32(bptr, i);
  }
  // do something with buf (use malloc instead of stack if you want return it!)
}