uIP - Daten senden mit Bestätigung

Gast #872194
Lesenswert?

Hallo zusammen.
Ich versuche gerade mit dem uIP Stack Daten zu senden. Prinzipiell 
funktioniert das auch gut. Zu gut. Für manche Anwendungen bin ich zu 
schnell, also habe ich eine while-Schleife eingebaut, die auf die 
Gegenstelle warten soll. Leider funktioniert das ganze nicht. Ich 
vermute weil ich mit der Schleife mein Programm lahm lege und uIP das 
Ack eben nicht empfangen kann :)

hier mein Code
1
  uip_send((void *)message.msg, message.characters);
2
  while(uip_acked() == 0)
3
  {
4
    if(uip_timedout() != 0 || uip_aborted() != 0 || uip_closed() != 0)
5
      break;
6
  }

Daher frage ich mich wie man sowas am besten lösen kann.

Das Problem ist, ich will in einer Funktion meine Sendefunktion aufrufen 
und etwas senden. Das will ich oft machen aber eben nur dann, wenn das 
vorherige Packet bestätigt wurde. Die Bestätigung kann ich aber nur über 
main erhalten, wo ich nicht hinkomme, solange ich meine große Stückzahl 
an Packeten senden will. Verwirrend.
Persönliche Seite #872590
Lesenswert?

Josef wrote:
> hier mein Code
>
1
>   uip_send((void *)message.msg, message.characters);
2
>   while(uip_acked() == 0)
3
>   {
4
>     if(uip_timedout() != 0 || uip_aborted() != 0 || uip_closed() != 0)
5
>       break;
6
>   }

Wundert mich, dass das überhaupt funktioniert. Du darfst uip_send nur 
aufrufen, wenn du innerhalb der Applikation bist, die vom uip Stack 
aufgerufen wurde (weil zB ein Paket angekommen ist). Du darfst sie nicht 
von extern aus benutzen.

uip.h:
1
 * This function is used to send out a single segment of TCP
2
 * data. Only applications that have been invoked by uIP for event
3
 * processing can send data.

Du solltest erstmal überlegen
1. Was willst du machen?
2. Wie willst du das machen?

Willst du eine TCP Verbindung zu einer Gegenstelle herstellen oder 
einfach ein UDP Paket schicken?

Für TCP benötigst du erstmal eine offene Verbindung (uip_open). Dann 
legst du eine uip-Applikation auf den Stack. Diese wird gestartet, 
sobald die Gegenstelle die Verbindung angenommen hast.
Und jetzt darfst du bei jedem Aufruf der uip-Applikation überprüfen ob 
neue Daten vorhanden sind. Falls ja: Sende sie. Falls nein: kannst du zB 
closen oder die TCP Verbindung auf stop stellen.
Wenn du die Verbindung auf stop stellst, kommt aber kein neues Paket 
mehr von der Gegenstelle (solange, bis du wieder eines schickst). 
Trotzdem wird die Applikation aber (bei richtiger Integration) 
regelmäßig aufgerufen (kannst du mit der Test-Funktion uip_poll() 
bestimmen).

PS: uip_acked() usw sind Testfunktionen. Diese sollst du innerhalb 
deiner Applikation anwenden und nicht außerhalb.
Gast #872625
Lesenswert?

Also meine Sendefunktion wird von einer Funktion in der 
"uIP-Statemachine", ähnlich der auf Seite 12 im uip-refman.pdf, 
aufgerufen.
Meine Webseite wird schon richtig übertragen und meine anderen Anwendung 
läuft mittlerweile auch, wobei die Lösung ein Puffer war.

Ich verstehe nicht ganz was du mir sagen willst? uip_send darf nur als 
Folge des Aufrufs,der in die in uipopt.h eingetragene Funktion, 
aufgerufen werden?! Wenn ja, dann mach ich das auch so. Also so wies 
beschrieben wird.

Kann ich eigentlich uip_connected auf mit "switch(uip_conn->lport)" und 
HTONS(XYZ) testen?
Persönliche Seite #872628
Lesenswert?

Josef wrote:
> Also meine Sendefunktion wird von einer Funktion in der
> "uIP-Statemachine", ähnlich der auf Seite 12 im uip-refman.pdf,
> aufgerufen.
> Meine Webseite wird schon richtig übertragen und meine anderen Anwendung
> läuft mittlerweile auch, wobei die Lösung ein Puffer war.

Dann solltest du es aber vermeiden while Schleifen in deine Anwendung 
einzubauen...
#875016
Lesenswert?

Hallo!

Wenn deine Applikation vom TCP-Stack aufgerufen wird, darfst du 
uip_send() nur einmal benutzen. Wenn du es mehrfachst verwendest, werden 
nur die Parameter des letzten Aufrufs an den TCP-Ausgangspuffer 
weitergereicht. Die Bestaetigung mittels uip_acked() wird erst beim 
naechsten Aufruf deiner Applikation durch uIP erfolgen.

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