UDP an mehrere Clients macht Problem

#4022120
Lesenswert?

Hallo,


ich sende mit dem Arduino und einem Ethernetshield an zwei weitere 
Arduinos mit Ethernetshield Daten via UDP.

1
Udp.beginPacket(clientip, clientport);
2
      Serial.println("Client 1 versendet Daten");
3
      Udp.print("123");
4
      Udp.endPacket();
5

6

7
Udp.beginPacket(client2ip, clientport);
8
      Serial.println("Client 2 versendet Daten");
9
      Udp.print("456");   
10
      Udp.endPacket();

Dies funktioniert ohne Probleme, und beide Clients bekommen dass an sie 
adressierte Datenpaket.

Wenn ich nun jedoch eine IF-Abfrage einbaue
1
if(hashabgleich2==1) {
2
      
3
      Udp.beginPacket(client2ip, clientport);
4
      Serial.println("Client 2 versendet Daten");
5
      Udp.print("456");   
6
      Udp.endPacket();
7
     
8
}

klappt das ganze bei erfüllter Bedingung ebenfalls Problemlos.


Bei zwei IF-Abfragen hintereinander, passiert allerdings etwas 
merkwürdiges:
1
      if(hashabgleich==1) {
2

3
      Udp.beginPacket(clientip, clientport);
4
      Serial.println("Client 1 versendet Daten");
5
      Serial.println(serverzeitid);
6
      Udp.print("123");
7
      Udp.endPacket();
8
      hashabgleich=0;     
9

10
 
11
}
12

13
      if(hashabgleich2==1) {
14
      
15

16
      Udp.beginPacket(client2ip, clientport);
17
      Serial.println("Client 2 versendet Daten");
18
      Udp.print("456");   
19
      Udp.endPacket();    
20
      hashabgleich2=0;
21

22
      
23
  }  
24
}


der Arduino sendet beide Zahlen also 123 und 456 in einem Datenpaket an 
client2ip obwohl diese unterschiedliche Empfänger eingetragen haben 
(clientip & client2ip), ich kann mir das einfach nicht erklären und 
werde langsam nervös, da dieses Projekt für die Schule dient und bald 
fertig sein muss wenn ihr mir da helfen könntet wäre das Klasse.


Hier die void setup() und die Definitionen der Variablen.

1
//IP-Libary-Definitionen
2

3
//Server Adresse:
4
byte servermac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEC };
5
IPAddress serverip(192, 168, 3, 1);
6
IPAddress serversubnet(255, 255, 255, 0);
7
IPAddress servergateway(192, 168, 3, 1);
8
int serverport = 8001; //Lokaler Port
9

10

11
//Client Adressen:
12
IPAddress clientip(192, 168, 3, 2); // IP-Adresse des 1 Clients
13
IPAddress client2ip(192, 168, 3, 3); // IP-Adresse des 2 Clients
14
int clientport = 8002; //Port der beiden Clients
15

16

17
char packetbuffer[UDP_TX_PACKET_MAX_SIZE]; //Bufferspeicher um Empfangene Pakete bis zur Bearbeitung zu speichern.
18
EthernetUDP Udp; //Beginnt eine UDP-Instanz
19

20

21

22
void setup() {
23

24
  Serial.begin(115200);
25
  Ethernet.begin(servermac, serverip, servergateway);
26
  server.begin();
27
  Udp.begin(serverport);
}

Was ich bereits probiert habe:

--> Wartezeit zwischen den beiden Udp.print's (10 Sekunden)
--> Udp.println, Udp.write klappen ebenfalls nicht
--> Außerhalb des ursprünglichen Sourcecodes in einer neuen Datei,  in 
zwei IF-Abfragen welche die Daten versenden tritt der Fehler ebenfalls 
auf.
-->Wenn eine IF-Abfrage auskommentiert wird klappt es wieder, ich denke 
es gibt ein Problem mit zwei UDP-Empfängern.
-->MAC & IP-Adresskonflikte sind ebenfalls keine vorhanden.

Bitte helft mir
#4022158
Lesenswert?

Ok, ich habe nun nach stundenlangem Suchen & Probieren in Google einen 
Hinweis auf eine begrenze Anzahl von Sockets des Ethernetshields 
gefunden, es ist mir zwar nicht klar warum bei einer simplen 
UDP-Nachricht das Socket nach dem Versand von der Libary nicht 
geschlossen wird wenn das ganze Protokoll sowieso verbindungslos 
aufgebaut ist jedoch stellte es sich heraus das wenn nach dem Befehl 
udp.stop & vor der nächsten Übertragung UDP.begin(clientport) aufgerufen 
wird die Datenübertragung reibungslos klappt.

Die Website von Arduino etc. weisen darauf überhaupt nicht hin, generell 
ist die gesamte Arduino-Netzwerk Dokumentation sehr sehr schlecht ich 
werde nach diesem Projekt versuchen C zu lernen.
Gast #4022204
Lesenswert?

Max E. schrieb:
> Ok, ich habe nun nach stundenlangem Suchen & Probieren in Google einen
> Hinweis auf eine begrenze Anzahl von Sockets des Ethernetshields
> gefunden, es ist mir zwar nicht klar warum bei einer simplen
> UDP-Nachricht das Socket nach dem Versand von der Libary nicht
> geschlossen wird wenn das ganze Protokoll sowieso verbindungslos
> aufgebaut ist

-> ICMP

Du möchstest aber auf dem Weg wissen, ob ein Router/Host das Paket nicht 
verwirft.

http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol

ICMP Type 3

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren