Hallo, ich habe folgende Problem: ich will mit einem XMEGA-Mikrocontroller sowohl über UDP DHCP realisieren als auch mit UDP die Zeit über NTP holen. Nun ist es so, dass nach DHCP-INIT und dem darauffolgenden Verbindungsaufbau mit der DHCP-Prozedur auf PORT 67/68 nicht mehr eine neue Verbindung für NTP aufgebaut werden kann auf PORT 123. CODE: void dhcp_init(void) { uip_ipaddr_t addr; // initially, the IP-Address must be 0.0.0.0 // otherwise the DHCP server would NAK the request uip_ipaddr(addr, 0, 0, 0, 0); uip_sethostaddr(addr); status.state = DHCP_STATE_INITIAL; // Destination is the broadcast address uip_ipaddr(addr, 255, 255, 255, 255); status.conn = uip_udp_new(&addr, HTONS(dhcp_SERVER_PORT)); if (status.conn != NULL) { uip_udp_bind(status.conn, HTONS(dhcp_CLIENT_PORT)); } PT_INIT(&status.pt); } hier wird also eine neue Verbindung eingerichtet um eine IP zu beziehen vom Server PORT67 zum Clienten Clienten PORT68 Danach kommt die NTP-INIT: CODE: static struct uip_udp_conn *ntp_conn = NULL; void ntp_init(void) { static uint16_t ntpIP_tmp[4]; ntpstat.state = STATE_IDLE; nvm_eeprom_read_buffer(0x112, ntpIP, 4); memmove(&ntpIP_tmp[0], (uint8_t *)&ntpIP , 1); memmove(&ntpIP_tmp[1], (uint8_t *)&ntpIP + 1, 1); memmove(&ntpIP_tmp[2], (uint8_t *)&ntpIP + 2, 1); memmove(&ntpIP_tmp[3], (uint8_t *)&ntpIP + 3, 1); if(ntpIP_tmp[0] == 0xFF && ntpIP_tmp[1] == 0xFF && ntpIP_tmp[2] == 0xFF && ntpIP_tmp[3] == 0xFF) { uip_ipaddr(ntpIP, 134,130,4,17); nvm_eeprom_erase_and_write_buffer(0x112, ntpIP, 4); } if(ntp_conn != NULL) { uip_udp_remove(ntp_conn); } ntp_conn = uip_udp_new(&ntpIP, HTONS(123)); if(ntp_conn != NULL) { uip_udp_bind(ntp_conn, HTONS(123)); } } Danach wird bei bestehenden UDP-Verbindungen die folgende Funktion aufgerufen, um die UDP-Verbindungen zu dispatchen anhand der PORTS void udp_appcall(void) { if(uip_udp_conn->rport == HTONS(123)) { // NTP protocol ntp_appcall(); } if((uip_udp_conn->rport == HTONS(67)) || (uip_udp_conn->lport == HTONS(68))) { // NTP protocol dhcp_appcall(); } } Die DHCP-Prozedur kann erfolgreich eine IP beziehen und eine Verbindung aufbauen, aber danach kann keine NTP-Zeit mehr geholt werden mit NTP. Ohne DHCP, also statischer IP, funktioniert die NTP-Zeitabfrage über UDP. Was läuft hier falsch. Übrigens die NTP-INIT kommt direkt nach DHCP-Init. Ist also möglicherweise die NTP-Init fehlgeschlagen oder muss vorher die DHCP-Verbindung explizit beenden werden? Oder muss wegen DHCP überhaupt eine permanente Verbindung zum Router bestehen. Ich hoffe hier kennt sich jemand aus mit solchen Netzwerksachen.
Grundsätzlich ist UDP ein verbindungsloses Protokoll. Es werden nur Datagramme übermittelt. Es gibt also, im Gegnesatz zu TCP, keine Sessions, also keine "State-Machine". Da DHCP über UDP läuft, ist es hier identisch. Wenn es bei dir nicht funktioniert, liegt es 100%ig am C-Code und, was auch immer du für eine Lib verwendest, du hast sie bestimmt nicht selbst gecoded, denn sonst wüsstest du ja schon, was da schief läuft. Fremde Libs haben jedoch das Problem, dass sie 1001 Szenarios abdecken wollen und haben deshalb meistens States, obwohl sowas bei UDP überhaupt nichts zu suchen hat. Kurz: Probier eine Reinitialisierung, da sich ja deine IP geändert hat. Es ist zwar totaler Schwachsinn, wegen einer geänderten IP bei UDP(!) das "Objekt" neu zu initialisieren, aber es ist ja, wie gesagt, eine C-Lib. Und da habe ich schon die idiotischten Implementierungen gesehen. Grad sowas banales wie UDP hätte man aber auch mal selbst hinrotzen können ;)
:
Bearbeitet durch User
Das Problem war an einer anderen Stelle zu finden. Man musste in der uip-conf.h diese Stelle ändern * Maximum number of UDP connections */ #define UIP_CONF_UDP_CONNS 2 Vorher war sie aus unerfindlichen Gründen nur auf 1 gestellt.
Al N. schrieb: > Maximum number of UDP connections Was ist eine "UDP Connection", ist das nicht ein Oxymoron? Hallenfreibad? Friedenspanzer? Dunkel wars, der Mond schien helle?
Bernd K. schrieb: > Al N. schrieb: >> Maximum number of UDP connections > > Was ist eine "UDP Connection", ist das nicht ein Oxymoron? > Hallenfreibad? Friedenspanzer? Dunkel wars, der Mond schien helle? Keine Ahnung, da musste mal mit den Erfindern von uIP dich auseinandersetzen. Auch wenn UDP keine richtige Connection ist, wird doch jeder Verbindungsaufbau in eine Struktur gespeichert und zyklisch abgearbeitet. Und hier wird angegeben, wie viele solcher "Verbindungen" es maximal geben darf.
Da hatte ich also wieder mal Recht gehabt, ohne die Lib zu kennen :D
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.