wie dhcp reallisierbar?



  • Hallo erst mal.

    Gibt es jemanden der sich mit DHCP auskennt, wie kann ich damit einen Server und einen Client reallisieren.

    Danke im vorraus.



  • Willst Du einen DHCP - Server programmieren oder nur einen Server im DHCP - Netzwerk??
    Der Server muss auf einem gewissen Port horchen während der Client eine UDP-Anfrage an das Netz sendet. Diese wird vom Server empfangen. Der Server sendet nun seinerseits seine aktuelle IP an die MAC(weltweit eindeutige Hardwarenummer auf der Netzwerkkarte) des Clients und meldet diesem seine neue IP

    Soll es nur ein Server im DHCP-Netzwerk sein, so sendet der Client seine IP als Rundruf ans Netz und der Server meldet seine IP zurück. Anschließend wird eine normale Socketverbindung aufgebaut.



  • Danke für die Antwort,
    da ich mir noch nicht ganz im klaren bin, würden mich beide Varianten interessieren.

    Danke im voraus.



  • Hallo <DocJunioR>
    wie kann der Client eine UDP-Anfrage ins Netz schicken?
    Wenn ich das mit 'sendto' mache, brauche ich ja die IP und den Port des Servers.

    Und wie ermittelt dann der Server die MAC-Adresse von meinen Client, den wenn der Server mit 'recvfrom' wartet bekommt er ja die IP vom Client.

    Das läßt mich schlußfolgern das der Client ja dann keine Dynamische IP hat sondern die ist ja dann fest, oder?

    Da kann man ja gleich eine Verbindung zum Server mit Connect aufbauen.

    HELP,HELP,HELP.



  • Original erstellt von <DocJunioR>:
    **Willst Du einen DHCP - Server programmieren oder nur einen Server im DHCP - Netzwerk??
    Der Server muss auf einem gewissen Port horchen während der Client eine UDP-Anfrage an das Netz sendet. Diese wird vom Server empfangen. Der Server sendet nun seinerseits seine aktuelle IP an die MAC(weltweit eindeutige Hardwarenummer auf der Netzwerkkarte) des Clients und meldet diesem seine neue IP

    Soll es nur ein Server im DHCP-Netzwerk sein, so sendet der Client seine IP als Rundruf ans Netz und der Server meldet seine IP zurück. Anschließend wird eine normale Socketverbindung aufgebaut.**

    Sicher, dass du das Konzept von DHCP bzw. BOOTP verstanden hasst?

    Zu dem Zeitpunkt, wo der Client seinen DHCP Request losschickt, hat er noch gar keine TCP/IP Adresse. Genausowenig weiss der Client, welche TCP/IP Adresse der DHCP Server hat.

    Der Client sendet per Broadcast 255.255.255.255 einen DHCP Request los, den der nächste DHCP Server beantwortet. Hierzu muss der DHCP Server natürlich auf Broadcasts achten. Wobei es ausreicht, wenn der DHCP Server auf einen Broadcast in seinem eigenen Subnetz horcht. Also z.B. auf 192.168.0.255. Das ganze ist beschrieben in Abschnitt 3 "Packet Format" von rfc951.

    rfc951: BOOTSTRAP PROTOCOL (BOOTP)
    ftp://ftp.rfc-editor.org/in-notes/rfc951.txt

    rfc1531: Dynamic Host Configuration Protocol
    ftp://ftp.rfc-editor.org/in-notes/rfc1531.txt

    rfc3011: The IPv4 Subnet Selection Option for DHCP
    ftp://ftp.rfc-editor.org/in-notes/rfc3011.txt



  • Original erstellt von e=mc²:
    Hallo <DocJunioR>
    wie kann der Client eine UDP-Anfrage ins Netz schicken?
    Wenn ich das mit 'sendto' mache, brauche ich ja die IP und den Port des Servers.

    Deswegen schickst du deinen Request ja auch entweder an die Broadcast Adresse in deinem TCP/IP Subnetz oder, falls dir dein Subnetz nicht bekannt ist, schickst du deinen Request an 255.255.255.255 los. Steht in der rfc951.

    Original erstellt von e=mc²:
    **
    Und wie ermittelt dann der Server die MAC-Adresse von meinen Client, den wenn der Server mit 'recvfrom' wartet bekommt er ja die IP vom Client.**

    Hä? Was meinst du mit "wenn der Server mit 'recvfrom' wartet bekommt er ja die IP vom Client."? Dein Client hat zu dem Zeitpunkt noch keine TCP/IP Adresse. Die MAC Adresse sendet dein Client als Bestandteil des DHCP Request im UDP Paket mit.

    Original erstellt von e=mc²:
    **Das läßt mich schlußfolgern das der Client ja dann keine Dynamische IP hat sondern die ist ja dann fest, oder?

    Da kann man ja gleich eine Verbindung zum Server mit Connect aufbauen.

    HELP,HELP,HELP.**

    Der Client hat zu dem Zeitpunkt noch *keine* TCP/IP Adresse. Deswegen fragt ein DHCP Client ja auch bei einem DHCP Server nach, dass dieser ihm eine TCP/IP Adresse zuteilt.

    The dhcp client starts up and then it sends out a packet. Since the system doesn't have an IP address, it broadcasts it as a UDP packet. The packet is sent to 255.255.255.255 to port 68 (or was it 67?) containing the machine's MAC address. A DHCP server on the network receives it and sends out the IP info in the packet to 0.0.0.0 port 67 (or 68?) addressing it specifically to the computer with the certain MAC address, yours. Your machine picks it up, read the info, and now has the IP info. Voola, you can surf the net.



  • <Descartes> Sicher, dass du das Konzept von DHCP bzw. BOOTP verstanden hasst?

    Würde ich das richtig verstehen, würde ich woll nicht solche Fragen stellen, oder?

    Wenn du dich so auskennst, kannst du mir nicht mal einen Code-Schnipsel geben.

    Danke im Voraus.



  • Original erstellt von <Descartes>:
    **Sicher, dass du das Konzept von DHCP bzw. BOOTP verstanden hasst?

    Zu dem Zeitpunkt, wo der Client seinen DHCP Request losschickt, hat er noch gar keine TCP/IP Adresse. Genausowenig weiss der Client, welche TCP/IP Adresse der DHCP Server hat.

    Der Client sendet per Broadcast 255.255.255.255 einen DHCP Request los, den der nächste DHCP Server beantwortet. Hierzu muss der DHCP Server natürlich auf Broadcasts achten. Wobei es ausreicht, wenn der DHCP Server auf einen Broadcast in seinem eigenen Subnetz horcht. Also z.B. auf 192.168.0.255. Das ganze ist beschrieben in Abschnitt 3 "Packet Format" von rfc951.

    rfc951: BOOTSTRAP PROTOCOL (BOOTP)
    ftp://ftp.rfc-editor.org/in-notes/rfc951.txt

    rfc1531: Dynamic Host Configuration Protocol
    ftp://ftp.rfc-editor.org/in-notes/rfc1531.txt

    rfc3011: The IPv4 Subnet Selection Option for DHCP
    ftp://ftp.rfc-editor.org/in-notes/rfc3011.txt**

    Ich denke schon, dass ich das verstanden habe.
    Meines Erachtens habe ich gesagt, dass die Antwort an die MAC des Clients geht.
    Des weiteren wird das Netz angesprochen, was in keinem Fall der Server alleine ist.

    Das Untere ist nur für den Fall, dass der Server kein DHCP - Server ist, sondern ein Terminal- oder Fileserver, der auch über DHCP seine Adresse bekommt.
    In dem Fall kennt der Client seine IP schon, genauso wie der Server.

    Ich hab das Prinzip schon verstanden - nur scheinbar nicht deutlich genug beschrieben - oder du zu schnell gelesen 😉

    cYa
    DjR



  • Um nicht in vergessenheit zu geraten, das ist mein Cleint Code mit der Broadcast Message, wollte mal Fragen ob das so richtig ist?

    int __fastcall TForm1::UDPinit()
    {
      long rc;
      SOCKET s;
      int len;
      char buf[256];
      const char FAR * optval;
      SOCKADDR_IN addr;
    
      /* set up the broadcast cast address */
      addr.sin_family = AF_INET;
      addr.sin_addr.s_addr = INADDR_BROADCAST;
      addr.sin_port = htons(67);
    
    /* create the socket */
      if((s = socket(AF_INET,SOCK_DGRAM,0)) == INVALID_SOCKET){
        sprintf(buffer,"Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        Memo1->Lines->Add(buffer);
        return false;
      }
    
    /* set it so it can broadcast */
      if(setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(int)) == SOCKET_ERROR){
    
        return false;
      }
    
      if((rc = sendto(s,(char*)buffer,0,0,(sockaddr*)&addr,sizeof(sockaddr_in))) == SOCKET_ERROR){
        sprintf(buffer,"Fehler: sendto, fehler code: %d\n",WSAGetLastError());
        Memo1->Lines->Add(buffer);
        return false;
      }
    
        rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
        if(rc==SOCKET_ERROR){
          sprintf(buffer,"Fehler: recvfrom, fehler code: %d\n",WSAGetLastError());
          Memo1->Lines->Add(buffer);
          return false;
        }else{
          sprintf(buffer,"%d Bytes empfangen!\n", rc);
          Memo1->Lines->Add(buffer);
          buf[rc]='\0';
          sprintf("Empfangene Daten: %s\n",buf);
          Memo1->Lines->Add(buffer);
        }
    
      return true;
    }
    

Anmelden zum Antworten