2009-10-01 10 views
6

मैं चार तरह चार प्रकार में एक IP पता होना आईपी = "192.123.34.134" मैं अंतिम मान (134) को बढ़ा देते चाहते हैं। क्या मुझे किसी को यह कैसे करना चाहिए? मुझे लगता है, मुझे इसे एक पूर्णांक में परिवर्तित करना चाहिए, और फिर वापस, लेकिन दुर्भाग्य से मुझे नहीं पता कि कैसे? :(मैं सी का उपयोग कर रहा ++।मैं स्ट्रिंग के रूप में प्रतिनिधित्व किए गए आईपी पते को कैसे बढ़ा सकता हूं?

कृपया मेरी मदद करो!

धन्यवाद, kampi

+4

तुम्हारा मतलब है चार * आईपी, है ना? –

उत्तर

23

आप एक पूर्णांक inet_addr का उपयोग कर के लिए एक स्ट्रिंग से आईपी पते परिवर्तित कर सकते हैं, तो फिर, यह जोड़ तोड़ के बाद, इसे वापस एक स्ट्रिंग के लिए कनवर्ट inet_ntoa साथ।

उनके उपयोग का तरीका बारे में अधिक जानकारी के लिए इन कार्यों के लिए the documentation देखें।

// NOTE: only works for IPv4. Check out inet_pton/inet_ntop for IPv6 support. 
char* increment_address(const char* address_string) 
{ 
    // convert the input IP address to an integer 
    in_addr_t address = inet_addr(address_string); 

    // add one to the value (making sure to get the correct byte orders) 
    address = ntohl(address); 
    address += 1; 
    address = htonl(address); 

    // pack the address into the struct inet_ntoa expects 
    struct in_addr address_struct; 
    address_struct.s_addr = address; 

    // convert back to a string 
    return inet_ntoa(address_struct); 
} 

* nix सिस्टम पर <arpa/inet.h>, या <winsock2.h> विंडोज पर शामिल करें:

यहां एक छोटा समारोह है कि तुम क्या चाहते हो जाएगा।

+0

मुझे पता है कि मेरा तेजी से निष्पादन होगा, लेकिन यह उत्तर निश्चित रूप से अधिक सही है। – Erich

+0

मैं सिर्फ यह मानने जा रहा हूं कि आप * बहिष्कृत * inet_ntoa के बजाय inet_ntop का मतलब है, है ना? ** सही? ** – Powerlord

+0

@ आर। बेमरोज आईपीवी 6 सिर्फ इस सवाल को अनावश्यक रूप से जटिल करता है; मूल प्रश्न में कहा गया है कि पता बिंदीदार चौकोर प्रारूप में होगा जो केवल आईपीवी 4 का तात्पर्य है। यदि आपके पास htonl/ntohl कॉल को बदलने के लिए कोई सुझाव है जो आईपीवी 6 पते के लिए काम करेगा, तो मैं खुशी से कोड अपडेट करूंगा। –

2

मैं एक विधि है कि उस प्रारूप में एक स्ट्रिंग को स्वीकार करता है लिखते थे।
4 पूर्णांक के लिए इसे बदलें। वेतन वृद्धि। (महत्वपूर्ण चेक रेंज)
तो फिर तुम somthing अधिक लंबे समय तक और मजबूत एक वर्ग आईपी पते का प्रतिनिधित्व चाहते हैं एक स्ट्रिंग के लिए वापस परिवर्तित।

। तो फिर तुम वर्ग को बनाए रखने के लिए एक के रूप में appropraite में हेरफेर और स्ट्रिंग के लिए कनवर्ट जब जरूरत।

#include <iostream> 
#include <istream> 
#include <sstream> 
#include <string> 
#include <stdexcept> 



class MyIp 
{ 
    struct Dot 
    {}; 
    struct Byte 
    { 
     Byte(unsigned char& val) 
      :m_val(val) 
     {} 
     unsigned char& m_val; 
    }; 
    friend std::istream& operator>>(std::istream& str,MyIp::Dot const& d); 
    friend std::istream& operator>>(std::istream& str,MyIp::Byte const& b); 
    friend std::ostream& operator<<(std::ostream& str,MyIp const& ip); 
    public: 
     MyIp(std::string const& ip) 
     { 
      std::stringstream str(ip); 
      str >> Byte(ad[0]) >> Dot() >> Byte(ad[1]) >> Dot() >> Byte(ad[2]) >> Dot() >> Byte(ad[3]); 
      std::string leftover; 
      if (str >> leftover) 
      { throw std::runtime_error("InvalidIP: Long"); 
      } 
     } 
     void inc(int index) 
     { 
      if ((index >= 0) && (index <=3)) 
      { 
       ++ad[index]; 
       if (ad[index] == 0) 
       { 
        inc(index-1); 
       } 
      } 
     } 
    private: 
     unsigned char ad[4]; 
}; 
std::istream& operator>>(std::istream& str,MyIp::Dot const& d) 
{ 
    char x = str.get(); 
    if (x != '.') 
    { throw std::runtime_error("Invalid IP: Dot"); 
    } 
    return str; 
} 
std::istream& operator>>(std::istream& str,MyIp::Byte const& b) 
{ 
    unsigned int val; 
    str >> val; 
    if (!str || val > 255) 
    { throw std::runtime_error("Invalid IP: Val"); 
    } 
    b.m_val = static_cast<unsigned char>(val); 
    return str; 
} 
std::ostream& operator<<(std::ostream& str,MyIp const& ip) 
{ 
    return str << static_cast<unsigned int>(ip.ad[0]) 
       << "." << static_cast<unsigned int>(ip.ad[1]) 
       << "." << static_cast<unsigned int>(ip.ad[2]) 
       << "." << static_cast<unsigned int>(ip.ad[3]); 
} 

int main() 
{ 
    try 
    { 
     std::string ip("127.0.0.1"); 

     MyIp addr(ip); 

     std::cout << addr << "\n"; 
     addr.inc(3); 
     std::cout << addr << "\n"; 
    } 
    catch(std::exception const& e) 
    { 
     std::cout << "What: " << e.what() << "\n"; 
    } 
} 
+0

यह उल्लसित है। +1। – glomad

+0

लोग मारने की तरह लोग :-) –

-2

इस साइट में मेरी टैब खा लिया, तो मैं फिर से कोशिश करेंगे। मुझे यकीन है कि इस तरह कुछ करने के लिए एक पुस्तकालय है, लेकिन यह काम करना चाहिए (मेरा वाक्यविन्यास मानना ​​गड़बड़ नहीं है) विचार को पूरा करने के लिए पर्याप्त है।

छद्म कोड:

char[] ipAddress= "192.123.34.134"; 

if (ipAddress[ipAddress.Length-1] == '9') 
{ 
    if(ipAddress[ipAddress.Length-2]=='9') 
    { 
     ipAddress[ipAddress.Length-1]='0'; 
     ipAddress[ipAddress.Length-2]='0'; 
     ipAddress[ipAddress.Length-3]=(char)ipAddress[ipAddress.Length-3]+1; 
    } 
    else 
    { 
     ipAddress[ipAddress.Length-2]=(char)ipAddress[ipAddress.Length-2]+1; 
     ipAddress[ipAddress.Length-1]='0'; 
    } 
} 
else 
{ 
    ipAddress[ipAddress.Length-1]=(char)ipAddress[ipAddress.Length-1]+1; 
} 
+0

'192.123.34.255' के बारे में क्या? –

+0

इस बिंदु पर, मुझे लगा कि इस तरह की रेंज जांच पहले से ही संभाली जा चुकी है। मेरे लिए, मुझे नहीं लगता कि 1 9 2.123.34.255 को 1 9 2.123.35.0 में बदलने का अर्थ होगा, जो मुझे लगता है कि अन्य समाधान एक पूर्णांक के माध्यम से जा रहे हैं। – Erich

+0

एह, अब आप इसका जिक्र करते हैं, x.x.x.99, या x.x.x.9 या तो काम नहीं करता है। मैं इन्हें ठीक कर सकता हूं, लेकिन हकीकत में, सॉकेट लाइब्रेरी फ़ंक्शंस का उपयोग करने वाले उपर्युक्त उत्तर अधिक सही हैं। – Erich

4

त्वरित/गंदा!

void increment(std::string& ip) 
{ 
    std::string::size_type dot = ip.find_last_of('.'); 
    std::stringstream stream(ip.substr(dot+1)); 
    int part = 0; 

    stream >> part; 

    part++; 

    stream.str(""); stream.clear(); 

    stream << part; 

    ip.replace(dot+1, std::string::npos, stream.str()); 
} 
+0

जब आप कोडिंग कर रहे थे तो मैं टाइप कर रहा था :) मेरा सी ++ कौशल जंगली है लेकिन आपका स्थान दिखता है। अच्छा प्रदर्शन। – Deverill

0

आप अंतिम "।" के स्थान का भी उपयोग कर सकते हैं। और अंत करने के लिए वहाँ से ले एक पूर्णांक में बदलने के लिए, इसे टक्कर 1, सीमाओं की जाँच करें और फिर इसे एक स्ट्रिंग में बदल जाएंगे और आधार हिस्से को जोड़ देते हैं।

0

यह शायद बहुत समझदार नहीं है, लेकिन इसके बारे में सोचने के लिए मजेदार था।

आईपी पते अंतरिक्ष के बाद से 32-बिट आप अहस्ताक्षरित 32-बिट पूर्णांक में आई पी पतों कन्वर्ट करने के लिए एक समारोह लिख सकता है। फिर आप 1 या जितना चाहें उतना जोड़ या घटा सकते हैं, और वापस आईपी पते में परिवर्तित कर सकते हैं। आपको रेंज जांच के बारे में चिंता करने की ज़रूरत नहीं है।

pseduo-कोड में 192.123.34.134 के लिए आपको बस इतना चाहते हैं:

int i = (192 << 24) + (123 << 16) + (34 << 8) + 134 

आम तौर पर, a.b.c. के लिएघ:

int i = (a << 24) + (b << 16) + (c << 8) + d 

अब i के रूप में ज्यादा बदलने के रूप में आप चाहते हैं (i++, i+=10000) और वापस परिवर्तित:

String ip = (i >> 24) + "." + 
      ((i >> 16) mod 256) + "." + 
      ((i >> 8) mod 256) + "." + 
      (i mod 256); 

कीजिए वाक्य रचना - मैं सी ++ अपने आप को बचाने के लिए नहीं लिख सका।

एमके

+3

यह बिल्कुल ठीक है inet_addr_t, जैसा कि नील के उत्तर में है, इसलिए स्वयं को रोल करने की आवश्यकता नहीं है। तो क्या यह सचेत है या नहीं, यह सी प्रोग्रामर साल से कर रहे हैं ... –

+0

मुझे लगता है कि मैं जावा दुनिया में बहुत लंबा रहा हूं अगर मैं सोच रहा हूं कि बिट-ट्विडलिंग थोड़ा कट्टर है, तो पॉइंटर के लिए धन्यवाद ! (पुण मूल रूप से इरादा नहीं है लेकिन देखा जब रखा जाता है।) – monorailkitty

3
int a,b,c,d; 
sscanf(str, "%d.%d.%d.%d", &a,&b,&c,&d); 
sprintf(str, "%d.%d.%d.%d\0", a,b,c,d+1); 
संबंधित मुद्दे