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 eingetreten

    warum 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


Anmelden zum Antworten