socket: EOF an Server



  • hi zusammen,

    ich kommuniziere mit einem java-service. ich baue dorthin eine tcp/ip verbindung auf und schicke xml-daten hin. danach wurde mir gesagt muss ich ein EOF "schicken" damit der server merkt das die anfrage fertig ist.

    ich habe ein bisschen gegoogelt und erfahren das wenn ich ein shutdown(sock,1); mache ein EOF an den Kommunikationspartner geht.

    soweit hat die sache bisher auch gut funktioniert. jetzt ist es jedoch so dass ich vor dem schließen des sockets auch nochmal eine nachrich an den server schicken soll. dies ist aber nicht mehr möglich weil ich schon einen shutdown aufs schreiben gemacht habe.

    daher meine frage: kann ich ein EOF an den Server bringen ohne einen shutdown auf das schreiben des sockets zu machen???

    danke im voraus
    mfg



  • abs0lut_beginner schrieb:

    ich habe ein bisschen gegoogelt und erfahren das wenn ich ein shutdown(sock,1); mache ein EOF an den Kommunikationspartner geht.

    es wird kein EOF sondern ein FIN an den anderen gesendet. FIN ist aber kein zeichen sondern ein flag im tcp header was der gegenstelle sagt dass man die verbindung beenden will...

    abs0lut_beginner schrieb:

    daher meine frage: kann ich ein EOF an den Server bringen ohne einen shutdown auf das schreiben des sockets zu machen???

    du sendst einfach das EOF zeichen (ja nachdem wie's bei dir definiert ist, -1 vielleicht?) und schliesst *danach* die verbindung.



  • ich kommuniziere mit einem java-service. ich baue dorthin eine tcp/ip verbindung auf und schicke xml-daten hin. danach wurde mir gesagt muss ich ein EOF "schicken" damit der server merkt das die anfrage fertig ist.

    Dann musst du ein Zeichen vereinbaren, das als Ende-Markierung dienen kann. Bei einem DOM-kompatiblen XML-Dokument kann der Server auch einfach beim schließen des root-nodes vom Ende ausgehen.

    Shutdown ist, wie der Name schon vermuten lässt dazu da, um die Verbindung wirklich zu beenden.



  • close/closesocket



  • c.rackwitz schrieb:

    close/closesocket

    ohne ein vorangegangenes 'shutdown' kann das, wenn man pech hat, voll daneben gehen. die verbindung wird abgewürgt (RST statt FIN, FINACK, ACK). der socket wird gelöscht, daten im ausgangsbuffer werden nicht mehr gesendet, gegenstelle empfängt das RST und sendet auch nichts mehr obwohl noch was im buffer war.
    guckt ihr: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/graceful_shutdown_linger_options_and_socket_closure_2.asp



  • ... ich mach das immer folgendermaßen:

    /* 1. Schritt */
    retval = shutdown(sockfd,SHUT_RDWR);
    if (retval < 0) ...
    
    /* 2. Schritt */
    retval = close(sockfd);
    if (retval < 0) ...
    

    Ohne das vorangeschaltete "shutdown" fehlten sonst teilweise die Rest-Daten.


Anmelden zum Antworten