Socket-Daten nach Programmende?
-
Hallo,
wenn ich Daten mit der send() Funktion der WinsockAPI verschicke
und dann das Programm beende - kann ich dann sicher davon ausgehen, dass die
Daten ankommen? Oder werde noch im TCP-Stack und noch nicht versandte Daten
dann aus diesem gelöscht?Gruss
Stefan
-
Guck dir die Doku zu "shutdown" an:
Speziell:(...)
To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect:Call WSAAsyncSelect to register for FD_CLOSE notification.
Call shutdown with how=SD_SEND.
When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
Call closesocket.Note The shutdown function does not block regardless of the SO_LINGER setting on the socket.
(...)
Mehr konnte ich dazu auf die Schnelle nicht finden. Wenn du sicher sein willst dass die Gegenstelle die Daten auch empfangen hat solltest du dir meiner Meinung nach aber sowieso von der Gegenstelle eine Antwort schicken lassen wenn das möglich ist (=wenn du das Protokoll bestimmen kannst).
-
Im Zweifelsfall einfach testen

-
Plotzenhotz schrieb:
Wenn du sicher sein willst dass die Gegenstelle die Daten auch empfangen hat solltest du dir meiner Meinung nach aber sowieso von der Gegenstelle eine Antwort schicken lassen wenn das möglich ist (=wenn du das Protokoll bestimmen kannst).
bei tcp braucht man kein extra ping-pong protokoll draufzusetzen (was ähnliches macht es selber). zum schliessen einer verbindung reicht auch ein 'graceful disconnect' mit shutdown o.ä.
manchmal ist es aber sinnvoll, die anzahl der daten vorwegzuschickem falls einer das netzwerkkabel abzieht, den rechner ausschaltet usw...
-
Ja was TCP macht ist mir schon klar, bloss was die Berkeley Sockets in dem Fall machen weiss icht nicht SO genau. Was in der MSDN Doku zu shutdown steht liest sich für mich einfach ... etwas kompliziert.
Wenn man sich eine Antwort schicken lässt kann man halt auch noch sicherstellen dass die Gegenstelle die Daten nicht nur in ihren Empfangspuffer gelegt hat, sondern die Applikation dort die Daten z.B. auch verarbeitet/weggesichert/... hat. Falls man das braucht, sonst ist es vermutlich unnützer Overhead (Flusswechsel, daher 1x round trip time als "Strafe").