2011-07-19 133 views
8

在該程序中我想增加IP地址。而我看到的輸出這樣的:增量IP地址

125.23.45.67 
126.23.45.67 
127.23.45.67 
128.23.45.67 
129.23.45.67 
130.23.45.67 
131.23.45.67 
132.23.45.67 
133.23.45.67 
134.23.45.67 

但我想看到的輸出是這樣的:

124.23.45.67 
124.23.45.68 
124.23.45.68 
124.23.45.70 
124.23.45.71 
124.23.45.72 
124.23.45.73 
124.23.45.74 
124.23.45.75 
124.23.45.76 

下面是程序代碼:

#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
using namespace std; 
#include "winsock2.h" 
#pragma comment(lib,"wsock32.lib") 

void main() 
{ 
in_addr adr1; 
in_addr adr2; 
int i; 

adr1.s_addr=inet_addr("124.23.45.67"); 
adr2.s_addr=inet_addr("as.34.34.56"); 
if (adr1.s_addr!=INADDR_NONE) 
    cout << " adr1 correct" << endl; 
else 
    cout << " adr1 incorect " << endl; 

if (adr2.s_addr!=INADDR_NONE) 
    cout << " adr2 correct" << endl; 
else 
    cout << " adr2 incorect" << endl; 

cout << inet_ntoa(adr1) << endl; 
cout << inet_ntoa(adr2) << endl; 

for (i=0;i<10;i++) 
{ 
    adr1.s_addr ++; 
    cout << inet_ntoa(adr1) << endl; 
} 
} 

回答

17

Big endian和little endian獲得另一個!使用htonl和ntohl來回轉換。

for (i=0;i<10;i++) 
{ 
    adr1.s_addr = htonl(ntohl(adr1.s_addr) + 1); 

    cout << inet_ntoa(adr1) << endl; 
} 
+0

thx很多。我一直在尋找這個功能「htonl」。 –

+0

+1,但翻轉字節排序看起來很駭人聽聞。雖然,[其他人](http://stackoverflow.com/questions/1505676/how-do-i-increment-an-ip-address-represented-as-a-string/1505709#1505709)同意你。 – darvids0n

+1

對IP地址做「數學」似乎很奇怪。當數學生成一個IP地址離開子網時會發生什麼?所有的角落案件都必須處理。 – selbie

6

要增加你需要一個IP地址將in_addr對象分解成4個int對象(short int也會這樣做)並將第4個對象分配到256,然後將其重置爲1並將第3個一個等等。您不應該直接在in_addr對象上使用++

編輯:好的,所以你可以適當增加它,如果你扭轉字節順序。我個人不會那樣做。特別是如果你所做的只是輸出IP字符串,而不是在代碼中的其他地方使用它們作爲in_addr

+1

你的版本太複雜恕我直言。 –

1

而不是使用adr1.s_addr的:

adr1.s_addr=inet_addr("124.23.45.67"); 
adr2.s_addr=inet_addr("as.34.34.56"); 

使用此:

u_long addr1=inet_addr("124.23.45.67"); 

,並增加addr1,即addr1++ 最後一個字節被遞增。

或者遵循這個公式:

if IP is A.B.C.D then u_long addr = A + 256*B + 256*256*C + 256*256*256*D