Ich habe vor einigen Wochen damit begonnen mir das Webserver-Projekt des
Herrn Radig vorzunehmen. Ich habe da so meine liebe Not mit der
Variablen dhcp_lease und wie diese anhand des char-arrays "gefüllt"
wird.
In der Datei dhcpc.c wird dhcp_lease als unsigned long bestimmt. Nach
meinem Verständnis sollte es sich fortan also um eine 32 bit schwere
Variable handeln in der 4 Zeichen abgelegt werden können sollten.
In der Funktion unsigned char dhcp(void) soll die Variable dhcp_lease
wie folgt gefüllt werden:
1 | dhcp_lease = (*((unsigned long*)&cache.lease[0]));
|
Weiter oben in derselben Funktion steht folgendes:
1 | if((dhcp_state == DHCP_STATE_FINISHED) && (dhcp_lease < 600))
|
Innerhalb der Webseite die in webpage.h abgelegt wird habe ich eine neue
"Ersetzung" mit dem Namen %LEASE, welche durch folgende Zeile in httpd.c
ersetzt wird, eingebaut:
1 | if(strncasecmp_P("LEASE", http_entry[index].new_page_pointer, 5) == 0)
|
2 | {
|
3 | ltoa(dhcp_lease, var_conversion_buffer, 10);
|
4 | str_len = strnlen(var_conversion_buffer, CONVERSION_BUFFER_LEN);
|
5 | memmove(ð_buffer[TCP_DATA_START + a], var_conversion_buffer, str_len);
|
6 | a = a + (str_len - 1);
|
7 | http_entry[index].new_page_pointer = http_entry[index].new_page_pointer + 5;
|
8 | }
|
Verwende ich den Code im "Original" wird mir eine LeaseTime angezeigt
die ein bischen mehr enthält als das was mein Router eigentlich vorhat.
Das geht in die Millionen Sekunden. Dieses "dhcp_lease < 600" dürfte in
Jahren nicht fällig werden. Mein Router vergibt eine IP für 1800
Sekunden. Ich habe aus der 600 also eine 1770 gemacht um zu sehen dass
da nach 30 Sekunden etwas geschieht. Fehlanzeige. Da passt also etwas
nicht.
Ich dachte mir also, ich ersetzte
1 | dhcp_lease = (*((unsigned long*)&cache.lease[0]));
|
durch
1 | dhcp_lease = 0;
|
2 | dhcp_lease = dhcp_lease + (cache.lease[3] << 0);
|
3 | dhcp_lease = dhcp_lease + (cache.lease[2] << 8);
|
4 | dhcp_lease = dhcp_lease + (cache.lease[1] << 16);
|
5 | dhcp_lease = dhcp_lease + (cache.lease[0] << 24);
|
Beim compilieren erhalte ich sodann folgenden Fehler:
1 | left shift count >= width of type
|
Kann mir mal bitte jemand erklären wie ich in dieses unsigned long 4
bytes aus dem Char-Array reingeprügelt bekomme?