Socket: beim schliessen alles noma schicken
-
hallo,
ich hab hier das problem das bei einem schliessen des sockets alles nochmal geschickt wird. also sgen wir ich sende etwas mit
send(sockfd, message, sizeof(message), 0);
close(sockfd);wird das genau einma geschickt, ist klar. auf der gegenseite wird das dingen mit recv einmal empfangen.
wenn ich aber auf der gegenseite recv in einer loop laufen lasse, die solange laeuft bis ret = recv(...) == 0, merkt man erst das es 2 mal ankommt!
ich hab dann ma gemacht
send(sockfd, message, sizeof(message), 0);
sleep(5);
close(sockfd);yo, damit merke ich auf der gegenseite das es EINMAL ankommt, dann 5 sec nix, dann kommt es nochmal an ( beim schliessen des sockets halt)
somit kommt alles 2ma an...woran liegt das, wir kann ichs beheben?
danke
close(sockfd);
-
Ich vermute, du empfängst falsch. Hast du den Fehlerrückgabewert von recv bedacht?
-
moin, also die loop sah so aus
while( ret = recv(connfd, answer, sizeof(answer), 0 ) != 0 )
if ( ret == -1 ) {
printf("received error from rimc -c: %s\n", answer);
exit(0);
} else
printf("%s\n", answer);damit wurde answer immmer 2ma ausgegeben.
-
diddi schrieb:
damit wurde answer immmer 2ma ausgegeben.
Einmal mit ""received error from rimc", einmal ohne? Oder zweimal ohne?
-
MFK schrieb:
diddi schrieb:
damit wurde answer immmer 2ma ausgegeben.
Einmal mit ""received error from rimc", einmal ohne? Oder zweimal ohne?
2mal ohne, wenn received error... kommt wird ja auch mit exit(0) beendet.
-
diddi schrieb:
moin, also die loop sah so aus
while( ret = recv(connfd, answer, sizeof(answer), 0 ) != 0 )
damit wurde answer immmer 2ma ausgegeben.
probier mal
while( (ret = recv(connfd, answer, sizeof(answer), 0 )) != 0 )
-
entelechie schrieb:
diddi schrieb:
moin, also die loop sah so aus
while( ret = recv(connfd, answer, sizeof(answer), 0 ) != 0 )
damit wurde answer immmer 2ma ausgegeben.
probier mal
while( (ret = recv(connfd, answer, sizeof(answer), 0 )) != 0 )
so sollte es funktionieren
-
yo danke, damit sieht das schon besser aus (wusste garnet das da klammern erforderlich sind)
jetzt tritt der fall ein den MFK meinte
es wird immernoch 2 ma ausgegeben, einmal so normal und dann mit received error, weil erst wird halt >0 von recv returned, halt das was angekommen ist, das wird dann weitergeschickt
in der 2. runde returned recv aber -1! und bei -1 wird bei mir halt die fehlerbehandlung aufgerufen, daher logisch das es nun 2mal ankommt, ABER
RETURN VALUE
These calls return the number of bytes received, or -1 if an error
occurred. The return value will be 0 when the peer has performed an
orderly shutdown.-1 wird bei nem fehler zurueckgeben, und 0 bei nem normalen schliessen des sockets
so war das ja gedacht: solange ret != 0 ist, also KEIN schliessen der leitung erfolgte, wird in die schleife getreteten und geguckt obs error oder was regulaeres war.
ist es ein regulaeres schliesen der connection soll 0 returned werden, in die schleife wird nicht eingetretenwarum also wird -1 returned, obwohl der socket ganz normal geschlossen wurde? perror sagt
Connection reset by peer
wenn -1 returned wurde
danke
-
vielleicht solltest du beim schließen des sockets noch ein shutdown mit einbauen
-
danke, als mit shutdown anstatt close geht es!
aber wieso? soweit ich weiss schickt shutdown nur ein FIN, was macht denn close?
kann mir jemand den genauen unterschied zwischen shutdown und close erklaeren und wieso recv bei close -1 und bei shutdown 0 zurueckgibt?danke
-
auf deutsch:
na bei close wird der socket einfach geschlossen und das recv denkt es wäre ein Fehler aufgetreten. das shutdown sagt: Pass auf ich schließe mich jetzt, und somit gibt das recv keinen Fehler aus
-
achso, also close ist quasi die gewaltaetige beendingung eines sockets (vergleich: pc einfach ausschalten) und shutdown ist das saubere beenden der verbingung (vergleich: pc korrekt herunterfahren).
noch ne frage
sagen ich mach folgendes
ret = send(sockfd, temp, len, 0);
perror("");
printf("%d\n", ret);das komische ist nun, das ret weder -1 noch 0 oder sonstwas ist, sondern 120, und die lines auch am anderen ende ankommen (komischer weisse nicht alle, mittendrinn fehlen welche). trotzdem meldet perror bei jedem send
Illegal seek
wieso?danke
-
hat sich erledigt
-
trotzdem noch mal kurz:
perror() wertet die errno variable aus und die muss ja nicht zwangsweise während der Funktion send() geändert worden sein. das kann schon ganz wann anders gewesen sein. Deswegen solltest du perror() nur aufrufen wenn ret == -1 ist. du könntest alternativ auch GetLastError() und FormatMessage() benutzen. Schau mal in der MSDN nach