原始套接字编程 - 为什么printf()会影响数据包发送?

时间:2013-02-06 03:38:18

标签: c sockets raw-sockets

好的,这是一个非常奇怪的问题。我试图创建一个原始套接字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回复。 那是为什么?

1 个答案:

答案 0 :(得分:4)

当您无法初始化自动存储时,它获得的值取决于您的程序上次使用的内容,甚至是在同一VM空间中运行的先前程序。因此,任何都可能发生。添加代码行只会导致堆栈上one值的不同对齐。新变量中的那个变量中的垃圾允许原始套接字工作。另一个没有。这是运气。