2013-02-06 33 views
0

好吧,這是一個非常奇怪的問題。我試圖創建一個原始套接字ICMP數據包來欺騙ping請求。原始套接字編程 - 爲什麼printf()會影響數據包發送?

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回覆。然而,當我剛剛

close(s);前添加

unsigned char *ch = (unsigned char *)spoof;

事實證明,被欺騙的客戶端可以接收ping回覆。 這是爲什麼?

+0

對不起,我還沒有提到printf()的東西。但是,當第一個問題得到一些解釋時會出現。 – user2045372

+0

是否有可能在調試模式下運行程序?在調試模式下,大多數編譯器將未初始化的變量初始化爲默認值(取決於編譯器)。 – Patashu

回答

4

當您初始化自動存儲失敗時,它的值取決於程序上次使用的值,甚至是在同一VM空間中運行的以前的程序。因此,什麼都可能發生。添加代碼行只會導致堆棧上one值的不同對齊。垃圾在新位置的變量允許原始套接字工作。另一個沒有。這是運氣。