Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » socket programmierung recv fehler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.02.2007, 12:42 Uhr
FrohDoh



Hallo,

ich benutze ein async. socket mit folgenden optionen:


C++:
WSAAsyncSelect(s, g_iohwnd, SOCKET_IO_MESSAGE, (FD_ACCEPT | FD_CONNECT | FD_READ | FD_CLOSE | FD_WRITE));



messages werden über das fenster g_iohwnd verarbeitet.

Soweit funktioniert alles bestens, problem gibt es aber bei on recv.


C++:
        status = recv(
            m_clsocket,
            (char *)(InputData.m_buffer + InputData.m_buffer_size),
            RECV_SIZE,
            0);

        if(status == 0)
        {
            Console.ErrorMsg("recv: status = 0, socket closed", status);
            CloseClient();
            return;        
        }
        else if(status == SOCKET_ERROR)
        {
            status = WSAGetLastError();
            if(status != WSAEWOULDBLOCK)
            {
                Console.ErrorMsg("recv failed: reason %d", status);
                CloseClient();
                return;    
            }
            else
            {                
                break;
            }
        }    



das problem genau ist nun:
server sendet daten
server schließt verbindung
socket bekommt FD_READ message
socket versucht die daten noch zu lesen aber bemerkt verbindung unterbrochen wird und recv gibt 0 zurück anstatt die daten die ich noch brauche

bei einer schnellen verbindung kommen die daten noch an, bei langsamen verbindungen gibt es probleme .. was kann ich machen um sicherzustellen das ich immer alles empfange was vor dem schließen auch noch gesendet wurde?

danke im vorraus,
michael
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2007, 18:01 Uhr
~frager
Gast


da ich vermut, dass der server nur sendet, lässt du den solange laufen, bis der client was gesendet hat. das senden musst du natürlich auch noch übernehmen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.02.2007, 18:28 Uhr
FrohDoh




Zitat von ~frager:
da ich vermut, dass der server nur sendet, lässt du den solange laufen, bis der client was gesendet hat. das senden musst du natürlich auch noch übernehmen.


hmm ums senden geht es nicht wirklich, glaube hatte es schlecht beschrieben

- Client (ich) <-> Server Verbindung funktioniert im Prinzip ohne Problem
- irgendwann schickt Client die Anforderung "bitte log mich aus und schick mir Abschlußbericht"
- Server macht CleanUp und schickt noch weitere wichtige Daten
- Server trennt die Verbindnung
- Client bekommt FD_READ Message

nun kann 2 Dinge passieren:
1. recv liefert den Abschlußbericht und alles ist ok
2. recv liefert den Wert 0 zurück (MSDN: "If the connection has been gracefully closed, the return value is zero.")

Fall 2 tritt immer dann auf wenn die Internet Verbindung zum Server ungefähr den Wert von 100ms überschreitet. Meine Theorie ist, der Socket wird geschlossen obwohl noch Daten zum empfang zur Verfügung stehen nur kann man dies nicht irgendwie verhindern?

Problem ist halt das ich die letzten Daten vom Server theoretisch immer brauche.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.02.2007, 18:39 Uhr
~frager
Gast


das änderta ber nichts an meinem vorschlag. wenn dr server den abschlußbericht gesendet hat, wartet er darauf, dass der client noch ein "ich habe alles" schickt. wenn das da ist, kann der server ja immernoch die verbindung trennen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.02.2007, 18:48 Uhr
FrohDoh



Problem dabei ist, ich selber kann nichts am Server ändern
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.02.2007, 19:21 Uhr
~frager
Gast


dann gibt es leider auch keine andere möglichkeit
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.02.2007, 19:43 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn du socket-closed bekommst, dann hat er nix mehr im puffer, so einfach ist das - wenn also der server eben zu früh die verbindung kappt ohne wartet bis er alles gesendet hat, ist das ein fehler vom server
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: