好吧,这是一个很奇怪的问题。我试图创建一个原始套接字 ICMP 数据包来欺骗 ping 请求。
int s;
s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
然后
int one; // I should initialize it as 1, but I didn't.
const int *val = &one;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof(one));
....
原来因为我没有初始化一个为1,所以被欺骗的客户端收不到ping回复。但是,当我添加一个
unsigned char *ch = (unsigned char *)spoof;
就在
关闭(s);
,
事实证明,被欺骗的客户端可以收到 ping 回复。 这是为什么?
最佳答案
当你初始化自动存储失败时,它得到的值取决于你的程序最后一次使用它的目的,甚至是在同一个虚拟机空间中运行的前一个程序。因此,任何事情都可能发生。添加这行代码只会导致堆栈上的 one
值发生不同的对齐。该变量在其新位置的垃圾允许原始套接字工作。另一个没有。这是运气。
关于c - 原始套接字编程 - 为什么 printf() 会影响数据包发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721052/