2011-07-19 90 views
8

Trong chương trình đó, tôi muốn tăng địa chỉ IP. Và tôi nhìn thấy đầu ra như thế:Tăng địa chỉ 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 

Nhưng tôi muốn nhìn thấy đầu ra như thế này:

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 

Đây là mã chương trình:

#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; 
} 
} 

Trả lời

17

Big endian và little endian được một số khác! Sử dụng htonl và ntohl để chuyển đổi qua lại.

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

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

thx rất nhiều. Tôi đã jast tìm chức năng này "htonl". –

+0

+1, nhưng lật thứ tự byte dường như bị hack. [Những người khác] (http://stackoverflow.com/questions/1505676/how-do-i-increment-an-ip-address-represented-as-a-string/1505709#1505709) đồng ý với bạn. – darvids0n

+1

Làm "toán" trên một địa chỉ IP có vẻ kỳ quặc. Điều gì sẽ xảy ra khi toán học tạo ra một địa chỉ IP ngoài mạng con? Tất cả các trường hợp góc phải được xử lý. – selbie

6

Để tăng một địa chỉ IP mà bạn sẽ cần để chia nhỏ đối tượng in_addr thành các đối tượng 4 int (một số short int cũng sẽ làm) và tăng số thứ tư cho đến khi nó đạt đến 256 và sau đó đặt lại thành 1 và tăng thứ 3 một, v.v. Bạn không nên sử dụng trực tiếp ++ trên đối tượng in_addr.

EDIT: OK, vì vậy bạn có thể tăng nó đúng nếu bạn đảo ngược thứ tự byte. Cá nhân tôi sẽ không làm theo cách đó. Đặc biệt nếu tất cả những gì bạn đang làm là xuất ra các chuỗi IP và không sử dụng chúng như một mã số in_addr ở nơi khác trong mã.

+1

Phiên bản của bạn là quá phức tạp IMHO. –

1

Thay vì sử dụng adr1.s_addr:

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

Sử dụng này:

u_long addr1=inet_addr("124.23.45.67"); 

Và tăng addr1, ví dụ: addr1++ octet cuối cùng được tăng lên.

Hoặc làm theo công thức này:

if IP is A.B.C.D then u_long addr = A + 256*B + 256*256*C + 256*256*256*D 
Các vấn đề liên quan