Forum: Compiler & IDEs uIP - Daten senden mit Bestätigung


von Josef (Gast)


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.

von Simon K. (simon) Benutzerseite


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.

von Josef (Gast)


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?

von Simon K. (simon) Benutzerseite


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...

von Patrick W. (wieland)


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.

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
Noch kein Account? Hier anmelden.