求一个用Idudpserver写的检测客户端是否在线的源码[email protected]

解决方案 »

  1.   

    一个form,一个udpserver,一个udpclient,一个listbox
    最好在局域网内调试,如果只有一台机器,你就看先打开的程序,后打开的由于同ip登录的回应消息我屏蔽了,所以看不到
    ================================================
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdUDPClient, IdBaseComponent, IdComponent, IdUDPBase,
      IdUDPServer,IdSocketHandle;type
      TForm1 = class(TForm)
        server: TIdUDPServer;
        client: TIdUDPClient;
        ListBox1: TListBox;
        Button1: TButton;
        Button2: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        procedure serverUDPRead(Sender: TObject; AData: TStream;
          ABinding: TIdSocketHandle);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses Winsock;
    {$R *.dfm}
    var Ip:string;
    function LocalIP : string;
    type
      TaPInAddr = array [0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      phe:PHostEnt;
      pptr:PaPInAddr;
      Buffer:array [0..63] of char;
      I:Integer;
      GInitData:TWSADATA;
    begin
      WSAStartup($101, GInitData);
      Result := '';
      GetHostName(Buffer, SizeOf(Buffer));
      phe :=GetHostByName(buffer);
      if phe = nil then Exit;
      pptr := PaPInAddr(Phe^.h_addr_list);
      I := 0;
      while pptr^[I] <> nil do begin
      result:=StrPas(inet_ntoa(pptr^[I]^));
      Inc(I);
    end;
      WSACleanup;
    end;
    function BroadAddr(addr:string):string;
    var i:integer;
    begin
      result:='';
      for i:=length(addr) downto 1 do
      begin
        if ord(addr[i])=46 then
        begin
          result:=copy(addr,1,i)+'255';
          exit;
        end;
      end;
    end;
    procedure TForm1.serverUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var LogMessage:string;
        DataStringStream: TStringStream;
        s:string;
    begin
      DataStringStream:=TStringStream.Create('');
      DataStringStream.CopyFrom(AData, AData.Size);
      s:=DataStringStream.DataString;
      if byte(s[1])=1 then
      begin
        LogMessage:=#2;
        Client.Send(Ip,8880,LogMessage);
        listbox1.Items.Add(abinding.PeerIP);
      end;
      if byte(s[1])=2 then
      begin
        if abinding.PeerIP=LocalIP then exit;
        listbox1.Items.Add(abinding.PeerIP);
      end;
      if byte(s[1])=0 then
      begin
        listbox1.Items.Delete(listbox1.Items.IndexOf(abinding.peerIP));
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var LogMessage:string;
        ip:string;
    begin
      server.Active:=true;
      client.Active:=true;
      ip:=LocalIP;
      LogMessage:=#1;
      Client.Send(BroadAddr(ip),8880,LogMessage);end;procedure TForm1.Button2Click(Sender: TObject);
    var LogMessage:string;
        ip:string;
    begin
      ip:=LocalIP;
      LogMessage:=#0;
      Client.Send(BroadAddr(ip),8880,LogMessage);end;procedure TForm1.FormCreate(Sender: TObject);
    var port:integer;
    begin
      port:=strtoint(inputbox('输入端口号!','','8880'));
      client.Port:=port;
      server.DefaultPort:=port;
      client.Active:=true;
      server.Active:=true;
    end;end.