UDP Programmierung

 

UDP Pakete können direkt mit ETH_SendUDP versendet werden. Dabei beträgt die Maximalgröße 1460 Byte. Dies entspricht einer MTU von 1500 und einem 40 Byte UDP/IP header.

Um UDP Pakete empfangen zu können, wird mit ETH_SetConnBuf ein Empfangspuffer (Ringpuffer) reserviert und mit ETH_ListenUDP ein listening Port eingerichtet. Danach landen alle Pakete im Empfangspuffer. Wenn der Puffer voll ist, gehen die weiteren empfangenen Daten verloren. Der Puffer sollte daher regelmäßig mit der Funktion ETH_CheckReceiveBuf überprüft werden. Der Aufruf von ETH_ReceiveData kopiert die Pufferdaten in ein Bytearray. Wird dabei eine kleinere Datenlänge angegeben, als Paketbytes im Puffer sind, werden die auch die übrigen Bytes des Pakets aus dem Ringpuffer gelöscht.

 

 

 Es ist zu empfehlen, sich die Demoprogramme für UDP und TCP/IP anzuschauen.

 

 Als Default sind 4kb für den TCP/IP Stack reserviert. Je nach Nutzung braucht der Stack mehr oder weniger RAM. Der benötigte Speicher ist nur aufwendig zu berechnen, und sollte selbst durch Tests ermittelt werden.

 

 

Beispiele

 

1.Programm Sendet jede Sekunde einen String auf den Syslog Port 514:

 

void SendSyslogMsg(dword ip, byte level, char text[])
{
    byte buf[100];
 
    Str_Printf(buf, "<%d>%s", 16*8+level, text);
    ETH_SendUDP(ip, 514, buf, Str_Len(buf));
}
 
void main(void)
{
    while(1)
    {
        SendSyslogMsg(IP_ADDR(192,168,0,1), 3, "test message");
        AbsDelay(1000);
    }
}
 

 

2. Programm sendet auf UDP Port 50000 empfangene Daten wieder zurück an den Absender:

 

byte buf[ETH_BUF(500,0)], rbuf[200];  // 500 byte Empfangspuffer
 
void main(void)
{
    word info[4], plen;
    dword ip;
 
    ETH_SetConnBuf(buf, 500, 0);
    ETH_ListenUDP(50000);  // Listen auf Port 50000
 
    while(1)
    {
        ip= ETH_CheckReceiveBuf(info);
        if(ip)
        {
            plen= info[3];  // Länge
            if(plen > 200) plen= 200;  // Begrenze auf 200 bytes
            ETH_ReceiveData(rbuf, plen);
            ETH_SendUDP(ip, 50000, rbuf, plen);
        }
    }
}