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

标签 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;

就在

关闭(s);,

事实证明,被欺骗的客户端可以收到 ping 回复。 这是为什么?

最佳答案

当你初始化自动存储失败时,它得到的值取决于你的程序最后一次使用它的目的,甚至是在同一个虚拟机空间中运行的前一个程序。因此,任何事情都可能发生。添加这行代码只会导致堆栈上的 one 值发生不同的对齐。该变量在其新位置的垃圾允许原始套接字工作。另一个没有。这是运气。

关于c - 原始套接字编程 - 为什么 printf() 会影响数据包发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721052/

相关文章:

main 中的命令行参数

c++ - 是什么导致 fprintf 出现 C++ 缓冲区溢出错误?

c - c 中的宏数组——是否可能

c++ - 汇编指令是如何指示的?

google-chrome - 运行 flutter web 应用程序时无法创建服务器套接字

python - 如何在python程序中嵌入C代码?

libpcap - libpcap 在它们下面使用原始套接字吗?

javascript - 将支持 node.js 中的原始套接字,例如创建ping数据包?

c++ - 如何在 autoconf 中检查 clang 的支持编译标志

iPhone流式编程(CFStream) Hello World