remotehost属性是设置远程计算机名,不能获得远程计算机名吧。

解决方案 »

  1.   

    不能得到客户端的remotehost,但却可以得到remotehostip
      

  2.   

    winsock1.LocalHostName 
    是不是这个东系阿??
      

  3.   

    这是的到局域网卡的物理地址!得到名称和IP就很简单了!
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls ,winsock;type
      TNetResourceArray = ^TNetResource;  //网络资源类型的数组
      TForm1 = class(TForm)
        Memo1: TMemo;
        Panel1: TPanel;
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
        function GetIP(Sender: TObject; fcomputername:string) :string;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}                //函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
    Function GetServerList( var List : TStringList ) : Boolean; //参数List中返回服务器(工作组)的名称
    Var
        NetResource : TNetResource;
        Buf : Pointer;
        Count,BufSize,Res : DWORD;
        lphEnum : THandle;
        p:TNetResourceArray;
        i,j : SmallInt;
        NetworkTypeList : TList;
    Begin
        Result := False;
        NetworkTypeList := TList.Create;
        List.Clear;
        Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
        RESOURCEUSAGE_CONTAINER, Nil,lphEnum);  //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
        If Res <> NO_ERROR Then
          exit;    //执行失败,退出
        Count := $FFFFFFFF;  //执行成功,开始获取整个网络中的网络类型信息
        BufSize := 8192;  //不限资源数目
        GetMem(Buf, BufSize); //缓冲区大小设置为8K
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//申请内存,用于获取工作组信息
        If ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR )  Then //资源列举完毕
          Exit;  //执行失败
        P := TNetResourceArray(Buf);
        For I := 0 To Count - 1 Do      //记录各个网络类型的信息
          Begin
          NetworkTypeList.Add(p);
          Inc(P);
          End;
        Res:= WNetCloseEnum(lphEnum); //WNetCloseEnum关闭一个列举句柄
        If Res <> NO_ERROR Then
          exit;  
        For J := 0 To NetworkTypeList.Count-1 Do  //列出各个网络类型中的所有工作组名称
        Begin
          NetResource := TNetResource(NetworkTypeList.Items[J]^);//列出一个网络类型中的所有工作组名称 //网络类型信息
                                  //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
          Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
          RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
          If Res <> NO_ERROR Then
            break;  //执行失败
          While true Do  //列举一个网络类型的所有工作组的信息
              Begin
                Count := $FFFFFFFF;    //不限资源数目
                BufSize := 1024*16;    //缓冲区大小设置为8K
                GetMem(Buf, BufSize);  //申请内存,用于获取工作组信息,获取一个网络类型的文件资源信息,
                Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
                If ( Res = ERROR_NO_MORE_ITEMS )  or (Res <> NO_ERROR) then    //资源列举完毕
                    break; //执行失败
                P := TNetResourceArray(Buf);
                For I := 0 To Count - 1 Do  //列举各个工作组的信息
                  Begin
                    List.Add( StrPAS( P^.lpRemoteName ));
                    //取得一个工作组的名称
                    Inc(P);
                  End;
              End;
            Res := WNetCloseEnum(lphEnum);    //关闭一次列举
            If Res <> NO_ERROR Then
                break;  //执行失败
          End;
        Result := True;
        FreeMem(Buf);
        NetworkTypeList.Destroy;
    End;function TForm1.GetIP(Sender: TObject; fcomputername:string) :string;
    var
        WSAData: TWSAData;
        HostEnt: PHostEnt;
    begin
        HostEnt := nil;
        WSAStartup(2, WSAData);
        HostEnt := gethostbyname(PChar(fComputerName));
        if HostEnt <> nil then
        begin
          with HostEnt^ do
            result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]);
        end;
        WSACleanup;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    sl,s2:TstringList;
    i,j,k:integer;
    temp:string;
    begin
      temp:=ExtractFileName('computer.txt');
      memo1.lines.Clear;
      sl:=Tstringlist.create;
      s2:=Tstringlist.create;
      try
          if GetServerList(sl) then
          begin
          for i:=0 to sl.count-1 do
            begin
              memo1.lines.Add (sl.Strings[i]+':');
              try
                winexec(pchar('command.com /C net view /workgroup:'+sl.Strings[i]+' >'+temp),sw_hide);
              except
              end;
              k:=120;
              repeat;
                sleep(k);
                k:=k+40;
              until
                fileexists(temp);
              s2.LoadFromFile(temp);
              for j:=1 to s2.count-1 do
              begin
                if pos(':',s2.Strings[j]) >0 then
                    memo1.lines.Add (s2.Strings[j]);
                if pos('\\',s2.Strings[j]) >0 then
                    memo1.lines.Add (' '+copy(s2.Strings[j],1,15)+' IP: '+ GetIP(Sender,trim(copy(s2.Strings[j],3,20))));
                end;
          end;
          memo1.lines.Add('工作组个数:'+inttostr(sl.count));
          end
          else
          memo1.lines.Add('没有找到工作组!');
      except
      end;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      memo1.lines.Clear;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      memo1.lines.SaveToFile('LKnet.spl');
      action:=cafree;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      close;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      IF fileexists('LKnet.spl')  then
        Memo1.Lines.LoadFromFile('LKnet.spl');
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    //  if pos('工作组个数', memo1.Text) =0 then
    //    button1click(sender);
    end;end.