我对创建DNS(使用UDP协议发送)响应数据包感兴趣,但是我发现如何创建自己的数据包的信息有限。
大多数教程都像https://opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/
它们使用结构填充字段并将它们连接为1个序列。但是我担心编译器可以填充该结构,从而使其“损坏”(使数据包的长度超出应有的长度)
我完全知道有结构属性,不允许编译器填充结构,但我不想使用它们
谁能给我一些有关数据包创建的资源。我可以使用Libpcap和原始套接字
答案 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!)
}