2012-12-05 52 views
6

मुझे यह निर्धारित करने की आवश्यकता है कि कोई विशेष स्ट्रिंग मान्य आईपीवी 4 या आईपीवी 6 पता अक्षर है। यदि मैं सही ढंग से समझता हूं, तो POSIX सिस्टम पर ऐसा करने का सही तरीका inet_pton का उपयोग नेटवर्क पता संरचना में परिवर्तित करने के लिए करना है और देखें कि यह सफल होता है या नहीं। विंडोज विस्टा और बाद में InetPton है जो अनिवार्य रूप से वही काम करता है। लेकिन जहां तक ​​मैं कह सकता हूं, विंडोज एक्सपी उन में से किसी एक को घोषित नहीं करता है, और मुझे इसे XP पर सही तरीके से करने में सक्षम होना चाहिए। तो, सवाल यह है कि ऐसा करने के लिए सिस्टम किस प्रणाली का उपयोग करता है?विंडोज XP XP inet_pton या InetPton के बराबर क्या है?

सबसे खराब मामला, मैं इसे स्वयं पार्स करने के लिए एक फ़ंक्शन लिख सकता हूं, लेकिन मैं एक मानक, सिस्टम फ़ंक्शन पसंद करूंगा जिसे इसलिए पूरी तरह से परीक्षण किया गया है और सभी कोने के मामलों और क्या नहीं है। यह पहले से ही इतना बुरा है कि माइक्रोसॉफ्ट सिर्फ inet_pton को हर किसी की तरह घोषित नहीं कर सका और अपने नए ओएस के लिए InetPton के साथ चला गया।

+3

कोशिश करें [WSAAddressToString] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms741516 (v = vs.85) .aspx) – soulseekah

उत्तर

3

एसडीके हेडर फाइलों के माध्यम से देखकर मुझे inet_pton() में घोषित किया गया "सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज \ v7.1 \ \ WS2tcpip.h शामिल करें"। InetPton केवल उसमें # परिभाषित है।

तो ऐसा लगता है कि एमएस सभी के बाद उचित इंटरफ़ेस प्रदान कर रहा है, लेकिन केवल Vista के साथ शुरू हो रहा है। लेकिन XP में कोई IPv6 समर्थन नहीं है जो उल्लेखनीय है, अगर मुझे सही याद है।

दूसरी पसंद यह है कि इसे WSAAddressToString() पर दो कॉल के साथ लपेटें, एक AF_INET, AF_INET6 के साथ। मैं यहां दस्तावेज़ों से अनुमान लगा रहा हूं, कोशिश नहीं की है।

5

लेकिन जहां तक ​​मैं कह सकता हूं, विंडोज एक्सपी उन में से किसी एक को घोषित नहीं करता है, और मुझे इसे XP पर सही ढंग से करने में सक्षम होना चाहिए।

InetPton documentation राज्यों निम्न आवश्यकताओं:

  • न्यूनतम समर्थित ग्राहक: Windows Vista [डेस्कटॉप क्षुधा केवल]
  • न्यूनतम समर्थित सर्वर: [केवल डेस्कटॉप क्षुधा] विंडोज सर्वर 2008

सबसे खराब मामला, मैं इसे स्वयं पार्स करने के लिए एक फ़ंक्शन लिख सकता हूं, लेकिन मैं एक मानक, सिस्टम फ़ंक्शन पसंद करूंगा जिसे इसलिए पूरी तरह से परीक्षण किया गया है और सभी कोने के मामलों और क्या नहीं है।

कैसे ओएसएस नेटवर्क उपकरण Wireshark से कोड के एक हिस्से के भरोसा के बारे में?

आप अपने source code repository में inet_pton के अपने reimplementation पा सकते हैं।

लाइसेंस (नीचे देखें) बहुत अनुमोदित है, इसलिए यह एक अच्छा विकल्प हो सकता है।साथ या शुल्क के बिना किसी भी प्रयोजन के लिए उपयोग करने के लिए की प्रतिलिपि, संशोधन, और वितरित इस सॉफ्टवेयर

एतद द्वारा दी गई है, बशर्ते कि इसके बाद के संस्करण कॉपीराइट नोटिस और यह अनुमति नोटिस सभी प्रतियों में दिखाई है।

8

Windows XP में आप इन कार्यों का उपयोग कर सकते हैं:

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

#include <winsock2.h> 
#include <ws2tcpip.h> 


int inet_pton(int af, const char *src, void *dst) 
{ 
    struct sockaddr_storage ss; 
    int size = sizeof(ss); 
    char src_copy[INET6_ADDRSTRLEN+1]; 

    ZeroMemory(&ss, sizeof(ss)); 
    /* stupid non-const API */ 
    strncpy (src_copy, src, INET6_ADDRSTRLEN+1); 
    src_copy[INET6_ADDRSTRLEN] = 0; 

    if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { 
    switch(af) { 
     case AF_INET: 
    *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; 
    return 1; 
     case AF_INET6: 
    *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; 
    return 1; 
    } 
    } 
    return 0; 
} 

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) 
{ 
    struct sockaddr_storage ss; 
    unsigned long s = size; 

    ZeroMemory(&ss, sizeof(ss)); 
    ss.ss_family = af; 

    switch(af) { 
    case AF_INET: 
     ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src; 
     break; 
    case AF_INET6: 
     ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src; 
     break; 
    default: 
     return NULL; 
    } 
    /* cannot direclty use &size because of strict aliasing rules */ 
    return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)? 
      dst : NULL; 
} 

यह है कि। Ws2_32 लाइब्रेरी के साथ लिंक करें।

+1

ध्यान दें कि आपको WSAStartup को कॉल करने की आवश्यकता होगी winsock2 शुरू करें। – leiflundgren

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

  • कोई संबंधित समस्या नहीं^_^