小弟写了一个程序.需要实现多台电脑与服务器的通讯!
没有路由.只有交换机. 由于条件限制客户机只能自动获起服务器的ip!
所以服务器必须得建立dhcp服务!
 请问用delphi怎么建立这个dhcp服务器呢!!越简单越好.只要能给客户机分配ip就行了!!能拼通服务器就行了!

解决方案 »

  1.   

    在服务器上安装个子DHCP服务就行了(Windows自带), 没必要自己去写DHCP服务的。
      

  2.   

    在服务器上安装个DHCP服务就行了(Windows自带),没必要自己去写DHCP服务的。
      

  3.   

    只要不是XP Home版本, 都自带DHCP服务的。控制面版里的添加删除,打开后选择添加删除WINDOWS组件。要XP安装盘!
      

  4.   

    回家在XP上测试了一下,没能找到DHCP服务。不好意思,上面误导LZ了。
      

  5.   

    在网上搜索了一下,没能找到DHCP报文中厂商标识Vendor Information tag部分的格式, 所以无法完成DHCP八种报文的分析。只能提供以下测试代码, 它可以接收并显示DHCP客户端发往服务器端的报文。在此基础上,掌握了厂商标识部分的结构之后就可完成整个DHCP服务:
    type
      DHCP_Package = packed record           //以下定义了除去厂商标识部分的DHCP报文结构
        OP           : Byte;
        Htype        : Byte;
        Hlen         : Byte;
        Hops         : Byte;
        TransactionID: DWord;
        Seconds      : Word;
        Flags        : Word;
        Ciaddr       : array[0..3] of Byte;
        Yiaddr       : array[0..3] of Byte;
        Siaddr       : array[0..3] of Byte;
        Giaddr       : array[0..3] of Byte;
        Chaddr       : array[0..15] of Byte;
        sName        : array [0..63] of Char;
        sFile        : array [0..127] of Char;
      end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      //使用的是Indy的UDP Server组件
      IdUDPServer1.Active := False;
      IdUDPServer1.DefaultPort := 67;    //DHCP服务端口
      IdUDPServer1.Active := True;
    end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
    var
      i: Integer;
      S: String;
      iLen: Integer;
      Package: DHCP_Package;       
      Options: array of Byte;      //厂商标识部分的数据
    begin
      iLen := AData.Seek(0, soEnd);
      SetLength (Options, iLen - SizeOf(Package));  AData.Seek(0, soFromBeginning);
      AData.Read(Package, SizeOf(Package));
      AData.Read(Options[0], iLen - SizeOf(Package));  //显示接收到的报文
      memReceived.Lines.Add('=============================');
      memReceived.Lines.Add(Format('IP=%s, Port=%d', [ABinding.PeerIP, ABinding.PeerPort]));
      memReceived.Lines.Add(Format('OP=%d, htype=%d, hlen=%d, hops=%d', [Package.OP, Package.Htype, Package.Hlen, Package.Hops]));
      memReceived.Lines.Add(Format('ID=%u, Seconds=%d, Flags=%d', [Package.TransactionID, Package.Seconds, Package.Flags]));
      memReceived.Lines.Add(Format('CI=%d.%d.%d.%d', [Package.Ciaddr[0], Package.Ciaddr[1], Package.Ciaddr[2], Package.Ciaddr[3]]));
      memReceived.Lines.Add(Format('YI=%d.%d.%d.%d', [Package.Yiaddr[0], Package.Yiaddr[1], Package.Yiaddr[2], Package.Yiaddr[3]]));
      memReceived.Lines.Add(Format('SI=%d.%d.%d.%d', [Package.Siaddr[0], Package.Siaddr[1], Package.Siaddr[2], Package.Siaddr[3]]));
      memReceived.Lines.Add(Format('GI=%d.%d.%d.%d', [Package.Giaddr[0], Package.Giaddr[1], Package.Giaddr[2], Package.Giaddr[3]]));
      S := '';
      for i := 0 to Package.Hlen - 1 do
        if S = '' then
          S := S + IntToHex(Package.Chaddr[i], 2)
        else
          S := S + ':' + IntToHex(Package.Chaddr[i], 2);
      memReceived.Lines.Add('CH=' + S);
      memReceived.Lines.Add('Name=' + String(PChar(Package.sName[0])));
      memReceived.Lines.Add('File=' + String(PChar(Package.sFile[0])));
      memReceived.Lines.Add('=============================');  //报文中的厂商标识部分
      S := '';
      for i := 0 to iLen - SizeOf(Package) - 1 do
        S := S + IntToHex(Options[i], 2) + ' ';
      memReceived.Lines.Add('Options:');
      memReceived.Lines.Add(S);
      memReceived.Lines.Add('=============================');
      memReceived.Lines.Add('');
    end;要完成完整的DHCP服务,LZ需要找到完整的DHCP协议文档。