2012-11-24 14 views
5

के साथ सी में आईसीएमपी अनुरोध कैसे प्राप्त करें। यह एक असाइनमेंट है, इसे कच्चे सॉकेट के साथ होना चाहिए। मुझे एक साधारण आईसीएमपी पिंग प्रोग्राम करने की ज़रूरत है। मैंने इसे आधार http://www.pdbuchan.com/rawsock/icmp4.c के रूप में उपयोग किया। लाइन 127 पर wlan0 है, मैं eth0 का उपयोग कर रहा हूँ।कच्चे सॉकेट

`

struct sockaddr_in rec; 

    unsigned char * pkt = (unsigned char *) malloc (IP_MAXPACKET * sizeof (unsigned char)); 

    if (recvfrom (sd, (void*)pkt, IP4_HDRLEN + ICMP_HDRLEN+datalen , 0, NULL, (socklen_t*)sizeof (struct sockaddr)) < 0) { 
    perror ("recvfrom() failed "); 
    exit (EXIT_FAILURE); 
    } 
    struct ip *ip = (struct ip *)pkt; 
    struct icmphdr *icmp = (struct icmphdr *)(pkt + IP4_HDRLEN); 

    printf("%s %s %d\n",(char*)inet_ntoa(*(struct in_addr*)&ip->ip_dst), 
      (char*)inet_ntoa(*(struct in_addr*)&ip->ip_src), 
     icmp->type); 
    free (pkt); 

` समस्या यह है कि ip_dst और ip_src मेरी मशीनों के आईपी के रूप में दिखाया जा रहा है, और 0 के रूप में ICMP प्रकार और नहीं 8. Wireshark दोनों ICMP जबाब पता चलता है: लाइन 290 में मैं इस कोडित और अनुरोध करें। शायद मेरा रिकॉर्फ़ गलत है, लेकिन मैंने लिनक्स के बारे में कुछ सुना है, टीसीपी/आईपी पैकेट को संभाला जा सकता है। यदि यह सच है, तो इसके लिए क्या कामकाज है?

संपादित करें: मैंने यह raw socket listener चेक किया लेकिन यह मेरी समस्या का समाधान नहीं किया।

+0

निर्माण मेरे द्वारा पोस्ट किए गए लिंक पर है। यह उस साइट के उदाहरणों से है। मैंने इस कोड को उस icmp4.c – liwing

उत्तर

6

मुझे नहीं लगता कि आप IPPROTO_RAW का उपयोग करते समय उत्तर प्राप्त कर सकते हैं।

आप

socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); 

IPPROTO_ICMP के साथ आप केवल एक ICMP पैकेट, न कि पूरी IP पैकेट भेजने होंगे उपयोग करना होगा।

हालांकि प्राप्त करते समय आपको पूरा आईपी पैकेट मिलेगा और आईसीएमपी उत्तर निकालना होगा। ध्यान दें कि आपको मेजबान को भेजे गए सभी आईसीएमपी पैकेट की एक प्रति प्राप्त होगी ताकि आपको उन्हें फ़िल्टर करना होगा।

प्रेरणा के लिए a real ping पर देखें।

+0

ठीक लाइन 2 9 0 में डाला, इसलिए मैंने यह http://pastebin.com/62JmMddE किया; मेरा प्रोग्राम ip_dst और ip_src दोनों को मेरे आईपी के रूप में प्रिंट करता है। और यदि मैं रिकॉर्ड्स में एक गैर-नल संरचना डालता हूं, तो मुझे खराब पता त्रुटि मिलती है। वह वास्तविक पिंग बस एक नया घोषित sockaddr_in देता है, जैसा कि मैं करने की कोशिश कर रहा हूं। – liwing

+0

लॉल, मैं इस inet_ntoa समस्या के बारे में कभी नहीं जानता। आपका बहुत बहुत धन्यवाद। मुझे तब भी यह नहीं मिलता है जब मुझे रिकॉर्फ़ में गैर-नल सॉकडर पैरामीटर का उपयोग करना चाहिए। – liwing