सी

2011-02-03 27 views
6

में मूल ट्रैसरआउट स्क्रिप्ट लिखना मुझे एक ट्रेसआउट स्क्रिप्ट लिखनी है, लेकिन मुझे यकीन नहीं है कि मेरे प्रयास सही हैं या नहीं।सी

अभी मैं ऐसा कर रहा हूँ (कृपया मुझे सही कर अगर मैं गलत या अनाड़ी कर रहा हूँ):

  1. आईपी के लिए एक struct समझे और udpheader
  2. जांच योग समारोह
  3. 2 सॉकेट खोलना: SOCK_RAW मोड में यूडीपी-पैकेट भेजने के लिए (टीटीएल में हेरफेर करने के लिए) और राउटर से आईसीएमपी-उत्तर प्राप्त करने के लिए एक।
  4. sendto() का उपयोग यूडीपी पैकेट
  5. भेजने के लिए कोई सुराग नहीं होने कैसे प्राप्त करते हैं और एक ICMP जवाब

वहाँ किसी भी अधिक आरामदायक तरीके sock_raw का उपयोग करने से टीटीएल को बदलने के लिए कर रहे हैं, जहां मैं सब को परिभाषित करने के लिए है कार्रवाई करने के लिए हेडर सामान खुद से? आईसीएमपी सॉक खोलते समय सॉकेट() के लिए मुझे किन पैरामीटर का उपयोग करना चाहिए? आईसीएमपी उत्तर कैसे प्राप्त करें?

उत्तर

2

आप किस प्लेटफ़ॉर्म को लक्षित कर रहे हैं?

if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) 
    err(5, "icmp socket"); 
if ((sndsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) 
    err(5, "raw socket"); 

लिनक्स पर, मेरा मानना ​​है कि, आप MSG_ERRQUEUE साथ IP_RECVERR और recvmsg(2) उपयोग करने की आवश्यकता, ip(7) देखें: यहाँ OpenBSD source से एक बीएसडी स्वाद है।

+0

आपके उत्तर के लिए धन्यवाद। यह मुझे एक लिट आगे लाया। –

2

जहां तक ​​टीटीएल का संबंध है, आप setsockopt() का उपयोग कर सकते हैं। लिनक्स पर ping के लिए iputils 'स्रोत से निकास यहां दिया गया है:

if (setsockopt(icmp_sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, 1) == -1) { 
    perror ("ping: can't set multicast time-to-live"); 
    exit(2); 
} 

if (setsockopt(icmp_sock, IPPROTO_IP, IP_TTL, &ittl, sizeof(ittl)) == -1) { 
    perror ("ping: can't set unicast time-to-live"); 
    exit(2); 
} 
+0

धन्यवाद, ऐसा लगता है कि यह बहुत आसान है। –