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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EdsionWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值