Zitat von Paladin_FRW
Punkt 1: Wie kann ich (syntaktisch) in C++ einen Socket eröffnen, der mit einem DHCP Server kommunizieren kann?
gar nicht. c++ kennt kein konzept namens socket. das ist systemabhaengig.
du hast hier mehrere moeglichkeiten unter linux.
1. verwenden der posix systemcalls (man socket(2), accept(2), bind(2), connect(2), ...)
2. verwenden einer c++ klassenbibliothek fuer netzwerkkommunikation (sock++, ACE, ...)
wie der konkrete code ausschaut haengt natuerlich davon ab wie du dich entscheidest.
Zitat von Paladin_FRW
Punkt 2: Welche Parameter (mir fällt kein besseres wort ein, es ist ja auch noch früh) hat der Socket, welche braucht der DHCP Server und wie kann ich dem (wiederum: es geht mir nur um die Syntax, die RFC's mit den erläuterten Optionen habe ich schon entdeckt) eigene Optionen schicken?
tja, ebenfalls abhaengig. generell laeuft die sache am client so ab:
du schickst deine anfrage ueber einen udp datagram socket an port 67 der broadcast addresse deines netzwerks.
du bindest einen udp datagram socket auf port 68 und wartest auf die antwort.
Zitat von Paladin_FRW
Ich kenn mich zwar mit DHCP nicht ganz so gut aus, aber ich denke, dass das wahrscheinlich mit RAW sockets gehen sollte.
nein. empfangene udp oder tcp pakete werden nie an raw sockets uebergeben.
falls du raw sockets mit dem linux SOCK_PACKET interface verwechselst so wuerdest du mit kanonen auf spatzen schiessen weil du damit auf den data link layer zugreifst.
etwas low level fuer so eine applikation.
ein bisschen beispielcode fuer die socket api hab ich dir hier zusammen kopiert (das ist nur ein schnell zusammengestueckeltes snippet aus ein paar sourcen von mir und deshalb nicht vollstaendig und auch nicht compiliert :). darin wird ein udp socket erstellt und auf port 68 gebunden. nun koenntest du von diesem socket lesen.
den c code in schoene c++ klassen zu giessen obliegt dir
<snip>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h> /* oder <cstring> in std::c++ */
....
int fd;
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(68);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != -1) {
if (bind(fd, (struct sockaddr*) &addr, sizeof(addr)) != 0) {
close(fd);
}
}
...
</snip>
Alles anzeigen