2013-01-10 9 views
5

मैं टाइमआउट और टीटीएल के साथ पिंग बनाना चाहता हूं। मैं ऐप्पल द्वारा कोड का उपयोग करता हूं ("Simple Ping")। मैंने इसे "iOS ping with timeout" पढ़ा। मैं कोड बदलने के लिए:आईओएस टाइमआउट पिंग और टीटीएल

CFSocketNativeHandle sock = CFSocketGetNative(self->_socket); 
struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 100000; // 0.1 sec 
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(tv)); 

bytesSent = sendto(
    sock, 
    [packet bytes], 
    [packet length], 
    0, 
    (struct sockaddr *) [self.hostAddress bytes], 
    (socklen_t) [self.hostAddress length] 
); 

लेकिन मुझे समझ नहीं आता, जहां मैं कोड है कि मुझे पैकेट प्राप्त करने के समय समाप्ति दिखाएगा रखना चाहिए। इसके अलावा मुझे टीटीएल (टाइम-टू-लाइव) जानकारी के साथ पिंग बनाना होगा। icmp_seq=count from=ip_address ttl=value_of_ttl time=value_of_replytime_ms

उत्तर

-1

तुम हमेशा receivefrom पर कुछ सीमा समय रख सकते हैं: मैं इस पद्धति पर आधारित जानकारी प्राप्त चाहते

 tv.tv_sec = 0; 
     tv.tv_usec = 10000; 
     setsockopt(recv_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); 
0

आईपी हैडर में डिफ़ॉल्ट टीटीएल को संशोधित करने के पैरामीटर के रूप में IP_TTL साथ setsockopt फोन (परीक्षण किया आईपीवी 4 के साथ):

- (BOOL)setTTL:(int)ttl{ 
 
    CFSocketNativeHandle sock = CFSocketGetNative(self->_socket); 
 
    int status = setsockopt(sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); 
 
    if(status < 0) 
 
    { 
 
     return NO; 
 
    } 
 
    return YES; 
 
}

"iOS ping with timeout" पूर्व पर्याप्त सॉकेट में आउटपुट टाइमआउट जोड़ें। जो मैं समझता हूं, उससे समय-समय पर पैकेट को इस अवधि के भीतर सॉकेट द्वारा नहीं भेजा जाएगा। मैं गलत हो सकता था, लेकिन मुझे आईसीएमपी हेडर और आईपीवी 4 हेडर (ICMP Packet format) से यह "टाइमआउट" मान नहीं मिला। यहाँ कंसोल लॉग और अनुरोध कर रहे हैं, प्रतिक्रिया पैकेट सेब के सरल पिंग का उपयोग कर कब्जा कर लिया:

enter image description here

enter image description here

enter image description here

आप केवल पिंग की प्रतिक्रिया समय जानना चाहते हैं, मैं अनुमान लगाएं कि आप खुद को प्रतिनिधि तरीकों से ट्रैक कर सकते हैं। टाइमस्पेम्प प्राप्त करें जब "didSendPacket" और "didReceivePingResponsePacket" फ़ंक्शन बुलाए जाते हैं और फिर अंतर की तुलना करते हैं।

संबंधित मुद्दे