µIP und UDP, mehrere Verbindungen parallel über UDP

Gast #4219334
Lesenswert?
• ▲
▼
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.
#4219389
Lesenswert?
• ▲
▼
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 ;)
Gast #4219638
Lesenswert?
• ▲
▼
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.
Gast #4219738
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.