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)<<"\n";
		}
		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

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

posted on 2013-08-28 19:37  andywangguanxi  阅读(1628)  评论(0编辑  收藏  举报