C 原始套接字编程-为什么printf()会影响数据包发送?
好的,这是一个非常奇怪的问题。我试图创建一个原始套接字ICMP数据包来欺骗ping请求C 原始套接字编程-为什么printf()会影响数据包发送?,c,sockets,raw-sockets,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)); .... 事实证明,
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*)欺骗代码>
就在
关闭代码>,
事实证明,被欺骗的客户端可以收到ping回复。
为什么会这样?当您无法初始化自动存储时,它得到的值取决于您的程序,甚至是在同一虚拟机空间中运行的上一个程序上次使用它的目的。因此,任何事情都可能发生。添加代码行只会导致堆栈上的one
值的不同对齐方式。新位置变量中的垃圾允许原始套接字工作。另一个没有。这是运气 当无法初始化自动存储时,它得到的值取决于您的程序,甚至是在同一虚拟机空间中运行的上一个程序上次使用它的目的。因此,任何事情都可能发生。添加代码行只会导致堆栈上的one
值的不同对齐方式。新位置变量中的垃圾允许原始套接字工作。另一个没有。这是运气 对不起,我没有提到printf()的事情。但是,当第一个问题得到一些解释时,它就会出现。是否有可能您正在调试模式下运行您的程序?在调试模式下,大多数编译器将未初始化的变量初始化为默认值(取决于编译器)。但是,当第一个问题得到一些解释时,它就会出现。是否有可能您正在调试模式下运行您的程序?在调试模式下,大多数编译器将未初始化的变量初始化为默认值(取决于编译器)。