Serwer DHCP C++ (BCB) i WinSock

0

Witam,

Mam za zadanie napisać serwer DHCP... Piszę go w BCB6 z wykorzystaniem WinSock.
Odbieram dane ( DHCPDISCOVER ) wysłane UDP broadcastem od klienta DHCP i tu zaczynają się schody...
Dowiedziałem się, że struktura wiadomośći DHCP posiada pole Option, a w nim o kodzie 53 ( długość
1 byte i wartość od 1 do 9 ) pole DHCP Message Type - mówiące o typie wiadomości DHCP.
W jaki sposób mogę dobrać się do wartości tego pola o kodzie 53, żebym mógł rozpoznać wiadomość
DHCPDISCOVER, lub inne?
Użyłem Wiresharka, żeby sprawdzić przychodzące datagramy i wydaje mi się że ich długości nie są za
każdym razem jednakowe dla wiadomości DHCPDISCOVER...

Proszę o jakieś wskazówki i z góry dziękuję.

Pozdrawiam,
Maciek

0

Do tego typu rzeczy najlepiej wykorzystać unie i pola bitowe. Napisz sobie klasę z wykorzystaniem tego typu składników, a programowanie protokołów tego typu stanie się przyjemnością ;)

0

Dziękuję za odpowiedź...

Ale mam jeszcze jedno pytanie, bo dopiero teraz się zorientowałem że odbierałem DHCPDISCOVER tylko od siebie... Gdy wyłączam usługę Klient DHCP, to nie odbieram DHCPDISCOVER od innego komputera, a on takowe wysyła ( sprawdzałem w Wiresharku ).

Oto fragment kodu odpowiedzialny za odbieranie datagramu:

      //------------------------------------------------------------------------
      // Utworzenie gniazda
      //------------------------------------------------------------------------
if (WSAStartup( MAKEWORD( 2 , 0 ) , &WSD) != 0) {
	Label1->Caption="Nie udało się wczytac biblioteki WinSock...!";
	}

      d_socket=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

      char broadcast = '1';

      if(setsockopt(d_socket,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof(broadcast)) < 0)
      {
      Label1->Caption="Błąd podczas ustawiania opcji broadcastu...";
      closesocket(d_socket);
      }

      //------------------------------------------------------------------------
      // ODEBRANIE datagramu
      //------------------------------------------------------------------------

      SenderAddr.sin_family=AF_INET;
      SenderAddr.sin_port=htons(67);  // port: 67 - serwer, 68 - klient 
      SenderAddr.sin_addr.s_addr=htonl(INADDR_ANY);

        if (bind(d_socket,(sockaddr*)&SenderAddr, sizeof (SenderAddr)) < 0)
        {
        Label1->Caption="Nie udało się wykonac bind dla socketu...";
        closesocket(d_socket);
        }

        recvfrom(d_socket,RecvBuf,BufLen,0,(SOCKADDR *)&SenderAddr,&SenderAddrLen);

Bardzo proszę o pomoc, bo już nie wiem co jest źle...

Pozdrawiam

0

zobacz buflen

0
  1. zobacz czy nie masz wlaczonego firewalla
  2. stworz 2 gniazda jeden z opcja broadcast drugi z bind na porcie 67
    jakos gniazdo broadcast nie chce odbierac

1 użytkowników online, w tym zalogowanych: 0, gości: 1