好的,这是一个非常奇怪的问题。我试图创建一个原始套接字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;
之前的
close(s);
,
事实证明,欺骗客户端可以收到ping回复。 那是为什么?
答案 0 :(得分:4)
当您无法初始化自动存储时,它获得的值取决于您的程序上次使用的内容,甚至是在同一VM空间中运行的先前程序。因此,任何都可能发生。添加代码行只会导致堆栈上one
值的不同对齐。新变量中的那个变量中的垃圾允许原始套接字工作。另一个没有。这是运气。