zoukankan      html  css  js  c++  java
  • C++输出IP地址段内的合法地址

    近半年的Intel实习生活快要结束了.马上要找工作了,这段时间打算把以前的知识复习复习,顺便在这里记录一下.这是当时去Intel面试的时候,面试官问的一道题.当时因为时间关系,只让我提供一个思路,并没有写出具体实现过程.下面把实现过程写上.主要是把IP地址转换成整数,这样比截取IP地址每一段内的值出来要快.最后把所有合法IP地址输出到文件中.

    #include <iostream>
    #include <string>
    #include <WinSock.h>
    #include <fstream>
    #pragma comment(lib,"ws2_32.lib")  
    using namespace std;
    
    int main()
    {
    	string startIPAddr, endIPAddr;
    	unsigned long startIP, endIP, index;
    	cout<<"input start and end IP"<<endl;
    	cin>>startIPAddr>>endIPAddr;
    	startIP = htonl(inet_addr(startIPAddr.c_str()));
    	endIP = htonl(inet_addr(endIPAddr.c_str()));
    	if(startIP > endIP)
    	{
    		cout<<"startIP must be smaller than endIP"<<endl;
    		return 1;
    	}
    	else
    	{
    		struct in_addr addr;
    		ofstream outfile("IPAddr.txt",ios::ate);
    		for(index = startIP; index <= endIP; index++)
    		{
    			addr.S_un.S_addr = ntohl(index);
    			outfile<<inet_ntoa(addr)<<"
    ";
    		}
    		outfile.close();
    	}
        getchar();
        return 0 ;   
    }

    以上使用的是Socket头文件中自带的对IP地址操作的函数,下面可以自己编写IP地址转换成长整型以及长整型转换成IP地址的函数.

    unsigned long iptol(const string& strip)  
    {  
        int a[4];  
        string ip = strip;  
        string strtemp;  
        size_t pos;  
        size_t i=3;  
      
        do  
        {  
            pos = ip.find(".");   //以点将IP地址分成四段,对每段的数字进行转换
            if(pos != string::npos)  //当搜索整个字符串完后,仍没find到要的字符,则返回npos
            {         
                strtemp = ip.substr(0,pos);   
                a[i] = atoi(strtemp.c_str());         
                i--;          
                ip.erase(0,pos+1);  
            }  
            else  
            {                     
    	        strtemp = ip;  
                a[i] = atoi(strtemp.c_str());             
                break;  
            }  
        }while(1);  
        unsigned long lresult = (a[3]<<24) + (a[2]<<16)+ (a[1]<<8) + a[0];  
        return lresult;  
    }  
      
    string ltoip(const unsigned long& nvalue)  
    {  
        char strtemp[20];  
        sprintf( strtemp,"%d.%d.%d.%d",  
            (nvalue&0xff000000)>>24,  
            (nvalue&0x00ff0000)>>16,  
            (nvalue&0x0000ff00)>>8,  
            (nvalue&0x000000ff) );  
      
        return string(strtemp);  
    }  
      

    参考:http://blog.csdn.net/hityct1/article/details/3861205

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    在C#中子线程如何操作主窗口线程上的控件
    创建数据透视表数据包含合并单元格
    sql,nosql
    Enthought科学计算,数据分析
    程序员常去的14个顶级开发社区
    Windows查看进程taskList,终止进程tskill
    Pandas库之DataFrame
    centos下chm阅读器
    c++回调函数
    __NSAutoreleaseNoPool(): ... utoreleased with no pool in place
  • 原文地址:https://www.cnblogs.com/gxwang/p/4940870.html
Copyright © 2011-2022 走看看