2011-07-19 30 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

ビッグエンディアンとリトルエンディアンが別のものを取得します! htonlとntohlを使用して前後に変換します。

代わり adr1.s_addrを使用しての
for (i=0;i<10;i++) 
{ 
    adr1.s_addr = htonl(ntohl(adr1.s_addr) + 1); 

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

thxたくさん。私はjastがこの関数 "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も同様)、それが256に達するまで4番目のオブジェクトをインクリメントし、1にリセットして3番目のオブジェクトをインクリメントしますあなたはin_addrオブジェクトで++を直接使用するべきではありません。

EDIT:バイトオーダーを逆にすると正しく調整できます。私は個人的にはそうしないだろう。特にあなたがしているのは、IP文字列を出力していて、コードの他の場所でin_addrとして使用していない場合です。

+1

あなたのバージョンがあまりにも複雑私見です。 –

1

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