很是奇怪,我把点分十进制的IP,接受窗体输入的。转成网络字节码,再把字节码转换成点分十进制的字符串,为什么会是反的呢,比如转换回来的结果是1.0.168.192。因为转换我是在循环里面做的,就是把一个网段的地址全转一次,在循环里面就要反,在外面用个button来一个IP转一下,就是对的,正的。procedure TForm1.Button3Click(Sender: TObject);
var IP1,IP2,tem,temp1:DWORD; i:DWORD;
    sss:TStrings;
begin
  tem:= htonl(ntohl(inet_addr(Pchar(Edit1.Text))));
  temp1:= htonl(ntohl(inet_addr(Pchar(Edit2.Text))));
  //ShowMessage(IntToStr(htonl(ntohl(inet_addr(Pchar(Edit2.Text))))));
  //ShowMessage(IntToStr(tem));
  //ShowMessage(inet_ntoa(in_addr(tem)));
  while tem<=temp1 do
  begin
    Memo1.Lines.Add(inet_ntoa(in_addr(tem)));
    Sleep(1000);
    tem:=tem+1;
  end;
 { //sss:=TStringList.Create;
  IP1:=(ntohl(inet_addr(PChar(Edit1.Text))));
  IP2:=(ntohl(inet_addr(PChar(Edit2.Text))));
  for i:=IP1 to IP2 do
    begin
      //Memo1.Lines.Add(inet_ntoa(in_addr(i)));
      ShowMessage(inet_ntoa(in_addr(IP1)));
      Memo1.Lines.Add(inet_ntoa(in_addr(IP1)));
      IP1:=IP1+1;
    end;                       }
  //Memo1.Lines.AddStrings(sss);
end;

解决方案 »

  1.   

    网络字节顺序和Windows字节顺序是不一样的。
      

  2.   

    用那多htonl干什么?htonl($01020304) ==> $04030201
    htonl($04030201) ==> $01020304
      

  3.   

    inet_addr(IP String) => network byte order ip value
    inet_ntoa(network byte order ip value) => IP String
      

  4.   

    你在显示之前调用htonl转换一下。
      

  5.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      T: DWORD;
    begin
      T := inet_addr('192.0.0.1');
      Edit1.Text := IntToStr(T);  T := inet_addr('192.0.1.2');
      Edit2.Text := IntToStr(T);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      IP1,IP2,tem,temp1: DWORD;
      sss: TStrings;
    begin
      tem:= htonl(StrToInt(Edit1.Text));
      temp1:= htonl(StrToInt(Edit2.Text));  while tem <= temp1 do
      begin
        Memo1.Lines.Add(inet_ntoa(TInAddr(htonl(tem))));
        Sleep(1000);
        tem := tem+1;
      end;
    end;
      

  6.   

    上面代码可以太多了,看起麻烦,下面来个清晰的。
    procedure TForm1.Button4Click(Sender: TObject);
    var IP1,IP2,i:DWORD;
    begin
      IP1:=ntohl(inet_addr(PChar(Edit1.Text)));
      IP2:=ntohl(inet_addr(PChar(Edit2.Text)));
      for i:=IP1 to IP2 do
      begin
        Memo1.Lines.Add(inet_ntoa(in_addr((htonl(i)))));
      end;
    end;SQLDebug_Fan说的对,按你说的先用htonl转换一下就行了。也谢谢unsigned。感谢两位。小弟新手,分不多。对不住了。有点算点吧