EOF bei send/recv ???
-
send und recv sollten immer in schritten senden, ich schlage mal 256 bytes vor. Der erste byte, wird nun immer sagen wieviel bytes noch folgen. Sobald dieser nun < 255 ist, weiß der Empfänger, das das aktuelle Paket das letzte ist.
Beispiel für 321 Byte Datei:
send(socket,pBuffer,256,0); // empfänger: recv(socket,pBuffer,256,0); send(socket,pBuffer,67,0); // empfänger immer noch recv(socket,pBuffer,256,0);Jetzt macht der Empfänger aber folgendes:
if (pBuffer[0] < 255) { // datei mit dem letzten datenpaket beenden }Ich hoffe das war verständlich

mfg.
edit: die antwort mit shutdown war noch nicht da. Der Befehl ist in der MSDN erklärt. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/shutdown_2.asp
-
Frickler
-
aja...danke joomoo.
wie kann ich es denn dann auf der anderen Seite prüfen, wenn ich shutdown beim Server eingesetz habe?tmp=recv(...);ist dann tmp mit EOF definiert, oder in dem Buffer, wo das von recv empfangene steht?
-
#pointer# schrieb:
aja...danke joomoo.
wie kann ich es denn dann auf der anderen Seite prüfen, wenn ich shutdown beim Server eingesetz habe?tmp=recv(...);ist dann tmp mit EOF definiert, oder in dem Buffer, wo das von recv empfangene steht?
tmp ist dann genau 0
mfg.
-
welches Flag muss ich da denn jetzt genau benutzen, um zu sagen, dass jetzt nichts mehr kommt?
sorry für die vielen Fragen, aber es ist schon ziemlich wichtig für mich

-
#pointer# schrieb:
welches Flag muss ich da denn jetzt genau benutzen, um zu sagen, dass jetzt nichts mehr kommt?
sorry für die vielen Fragen, aber es ist schon ziemlich wichtig für mich

Server;
// accecpt send(Socket,"abc",4,0); shutdown(Socket,SD_SEND); // Socket schließenClient:
// connect char buf[4]; recv(Socket,buf,4,0); // normale übertragung int a = recv(Socket,buf,4,0); // diesmal wird a gleich 0 sein std::cout << a;Schau dich in der MSDN nochmal um, falls noch fragen offen sind.
mfg.
-
also ich finde es nicht gut den socket jedesmal zu schliessen und "recv(socket,pBuffer,256,0);" sagt nicht das da immer 256 zeichen dirin liegen auch wenn 256 zeichen gesendet werden.
zu prüfen auf /0 find ich auch keine gute lösung.
warum lässt es sich nicht im vorfeld ermitteln wie viele zeichen gesendet werden... mal dumm gefragt?
und send, rev ohne thred... da klemmt doch alles!!
-
vdittrich schrieb:
also ich finde es nicht gut den socket jedesmal zu schliessen
Wieso nicht? Wenn das Programm danach fertig ist?
und "recv(socket,pBuffer,256,0);" sagt nicht das da immer 256 zeichen dirin liegen auch wenn 256 zeichen gesendet werden.
Ja, hat auch keiner gesagt.
zu prüfen auf /0 find ich auch keine gute lösung.
Ist es auch nicht bei binär Dateien.
warum lässt es sich nicht im vorfeld ermitteln wie viele zeichen gesendet werden... mal dumm gefragt?
Ja das ist eigentlich die beste Lösung: Vorher die DAteigröße am besten als __int64 rüberschicken und dann solange empfangen, bis man alles hat.
und send, rev ohne thred... da klemmt doch alles!!
Darum geht's ja auch gar nicht.
mfg.
-
ich will ja auch nicht streiten, kenne die anforderung nicht und wenn ich eine classe entwickle, dann sollte sie allgemein sein.
geade bei socket verwende ich lieber threads, schon von der seite das man nie weis ob die "leitung" klemmt.
abbruchzeichen zu senden bzw. darauf zu prüfen halt ich für eine schlechte lösung... meine ansichten
-
vdittrich schrieb:
ich will ja auch nicht streiten
Ich auch nicht. Das mag ich immer an Foren nicht: Niemand hört deinen Tonfall. Einige Sachen können nett gesagt was ganz anderes bedeuten als nicht nett oder so.
, kenne die anforderung nicht und wenn ich eine classe entwickle, dann sollte sie allgemein sein.
Ich glaube er will erst mal versuchen ein einfaches Programm zu schreiben, als gleich das ganze in eine Klasse zu packen.
geade bei socket verwende ich lieber threads,
Ich auch

abbruchzeichen zu senden bzw. darauf zu prüfen halt ich für eine schlechte lösung... meine ansichten
ist nicht die ideallösung, vor allem wenn danach noch was kommen soll, da hast du Recht.
mfg.