PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C -> Socket-Timeouts



mrsuicide
01-02-2004, 13:54
Mein Ziel ist es, dass alle Daten, die ich über ein Socket A sende vollständig gesendet werden und vom Socket B vollständig empfangen werden.
Dabei verarbeite ich bei Socket B erst ein Datenpaket, bevor ein neues empfangen werden soll.

1. Wie kann ich es erreichen, dass das Datenpaket, das während der Verarbeitung des Vorherigen am Socket B ankommt, "aufgehoben" wird, bis ich wieder recv() aufrufe?

2. Timeouts. Ohne Timeout wollen meine Sockets nicht ordentlich funktionieren. recv() und send() geben ofters einen Wert < 0 zurück, obwohl die Verbindung noch besteht.
Ich habe das bisher immer mit usleep() geregelt. Aber gibt es einen sichereren Weg als mit usleep()? usleep() verbessert zwar meine Empfangs"chancen", aber es werden immer noch Pakete nicht empfangen...

anda_skoa
01-02-2004, 18:12
(1) sollte ansich das Standardverhalten einer TCP Verbindung sein.
Solange die Applikation die Daten nicht aus dem Empfangpuffer hohlt, lässt der Socket keine neuen Daten rein und der andere kann dann nicht schreiben.
(Vorraussetzung ist natürlich, dass die sendend Applikation auch prüft, ob sie schon wieder schreiben darf und nicht einfach in den Ausgangspuffer schreibt)

Zu (2):
Kenn mich mit diesen low-level C Sachen nicht so aus, aber normalerweise benutzt man select() oder poll() um zu entscheiden, ob was zum Lesen da ist, oder Schreiben wieder geht.

Ciao,
_

mrsuicide
01-02-2004, 20:55
(2) Ja. Ich habe von select() und poll() gehört. Wenn jemand näheres dazu weiss, wäre das Super! :)

Shack
01-02-2004, 23:59
Du musst nach dem Du ein ein Paket gesendet hast auf eine Empfangsnachricht
des Empfängers warten und erst dann das nächste Paket senden.

Der Empfänger sendet sebstverständlich nur das Empfangspaket, wenn er auch eins empfangen hat. z.B. --> send( sock_fd; "receive_package" );

Zwischendurch kannst du dann das Paket auswerten.

Und das ganze nennt man dann Protokoll !!!

anda_skoa
02-02-2004, 17:59
Original geschrieben von mrsuicide
(2) Ja. Ich habe von select() und poll() gehört. Wenn jemand näheres dazu weiss, wäre das Super! :)

Ich glaube zu select gabs hier im Forum schon mal ein Beispiel, versuchs mal mit der Suchfunktion. (in der man page von select ist auch eins)
poll() ist eigentlich vorzuziehen, da es flexibler als select() ist.


Original geschrieben von Shack
Du musst nach dem Du ein ein Paket gesendet hast auf eine Empfangsnachricht
des Empfängers warten und erst dann das nächste Paket senden.

Der Empfänger sendet sebstverständlich nur das Empfangspaket, wenn er auch eins empfangen hat. z.B. --> send( sock_fd; "receive_package" );


Bei TCP/IP macht das schon der TCP Stack.

Ciao,
_

Shack
02-02-2004, 19:21
Bei TCP/IP macht das schon der TCP Stack.


das ist wohl wahr. aber kann man das denn auch mit recv() einlesen ???

Und zu select() :

so weit mir bekannt ist, erkennt select nur an welchem Socket gerade Daten anliegen ( inbound oder outbound ) und setzt dann in nem Integer Array
ein Bit für den entspprechenden Filedescribtor. Also bei nur einem Integer kann man 32 filedescribtoren überwachen. Ist also für das Problem völlig ungeeignet, es sei denn der Serverprozeß wird in Zukunft mehr als einen Client erwarten.