Announcement

Collapse
No announcement yet.

Ich habe da ein ganz großes Problem mit dem ClientSocket: Error 10055 ...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ich habe da ein ganz großes Problem mit dem ClientSocket: Error 10055 ...

    Hiho ...
    Der Fehler 10055 (Kein Pufferplatz verfügbar) beschäftigt mich nun schon geraume Zeit. Ich fange erstemal vorne von vorne an. Die Verbindung ist eine nonBlocking (also auch asyncrone) Verbindung. Das soll auch so bleiben, da ich noch nicht genügend Ahnung von Streams und Threads habe und sowohl die Client als auch die Server Software so gut wie fertig ist. Das Problem ist ganz einfach: Ich versuche festzustellen, ob der Server reseted wurde. Wenn der Server nicht beendet wird, sondern einfach Reset gedrückt wird (also der Strom weg ist um es mal einfacher zu sagen ... ) bekomme ich kein Disconnect Ereignis. Also habe ich einen Timer, der alle 2 Sekunden versucht einen Buffer an den Server zu schicken. Wenn dies Fehlschlägt tritt ja logischerweise die ErrorRoutine in Kraft. Dort wird der Timer beendet und der Client mit Close beendet. Soweit so gut. Nun versucht ein anderer Timer wieder eine Con zu kriegen, indem er den Client auf Open setzt. Ist der Server noch nicht da tritt wieder der Error auf und der Client wird geschlossen usw, bis der Server wieder da ist. Ich bekomme nun aber diesen blöden Fehler, wenn der Server zu lange down ist, allerdings nur, wenn der Server schon einmal da war. Ich verstehe die Welt nicht mehr und habe schon alles mögliche ausprobiert. Ich hoffe hier kennt einer die Lösung und kann mir weiterhelfen. Ein Quelltext mit Beschreibung wäre natürlich perfekt. Oder einmal ganz anders gefragt : Kann man den Buffer leeren ??? Dann würde ich das nämlich vor jedem Open machen und dann sollte es ja kein Problem mehr geben, oder ??? Ich krieg den Fehler nicht abgefangen .........

    Hope u can help me ...

    Ciao Hagen

  • #2
    Ok ... Ich habe eine Lösung gefunden. Wenn es einen interessieren sollte, hier ist sie:<br><br>

    procedure TForm1.clientreset;<br>
    begin<br>
    client.free;<br>
    client := TClientSocket.create(Form1);<br>
    client.host := host;<br>
    client.port := port;<br>
    client.OnConnect := ClientConnect;<br>
    client.OnConnecting := ClientConnecting;<br>
    client.OnDisconnect := ClientDisconnect;<br>
    client.OnError := ClientError;<br>
    client.OnRead := ClientRead;<br>
    end;<br><br>

    Wenn beim übertragen ein Fehler auftritt, dann läßt man den ClientSocket halt einfach neu erstellen. Allerdings gehen dann logischerweise alle Werte verloren. Also muß man alle Ereignisse und Werte neu zuweisen. Also müssen Host und Port global sein und im FormCreate (oder wo auch immer) initialisiert werden. So das wars dann auch schon ... Vielleicht gibt es ja noch eine andere Lösung, wäre nicht schlecht die zu kennen, vielleicht ist die einfacher oder "sauberer"

    Ciao Hage

    Comment


    • #3
      Hiho ...<br>
      nunja ... ich dachte das würde reichen, aber der Error tritt immernoch auf, wenn der Server über 5 Min down ist. Kann mir da einer weiterhelfen ??<br>
      Das interessante an dem Error ist das er nur auftritt, wenn zuvor schonmal ein Connect da war. Weiß einer wie ich den Buffer leeren kann, oder töte ich damit alles was mit Netzwerk zu tun hat ? So langsam weiß ich nämlich nicht mehr was ich dagegen noch machen soll. Wofür gibt es eigentlich die Error Routine am ClientSocket ... ?
      <br><br>
      Ciao Hage

      Comment


      • #4
        Hallo,

        eine Diagnose kann man wohl nur stellen, wenn Du mal deine Timerrountinen und alles, was mit dem Client zusammenhängt hier postest.

        Grundsätzlich würde ich aber das Problem ganz anders lösen. Mein Vorschlag funktioniert allerdings nur, wenn folgende Voraussetzung erfüllt ist:

        Server als auch Client befinden sich innerhalb des selben C-Klassenetzes oder aber die Router im Netzwerk routen auch Broadcastnachrichten.

        Wenn dies gegeben ist, dann setze einfach einen UDP-Server auf deinem Server-PRG ein. Dieser verschickt als Broadcastnachricht z.B. im Intervall von 2 Sekunden eine Nummer via UDP.
        Bei jedem Neustart des Servers wird diese Nummer incrementiert.
        Auf den Clients kommt analog ein UDP-Client zum Einsatz. Empfängt dieser alle 2 Sekunden die gleiche Nummer, dann ist alles OK. Ist Sendepause, dann ist der Server aus was für Gründen auch immer OFFLINE. Verändert sich die empfangene Nummer, so ist klar, daß der Server neu gestartet wurde.

        Der Vorteil von UDP ist, daß es verbindunglos arbeitet. Dem Server ist völlig egal, ob kein, einer oder 200 Clients am Lauschen sind. Ebenso ist es für die Clients völlig unerheblich, ob der Server auf natürliche oder unnatürliche Weise verstorben ist.

        Als UDP-Komponenten würde ich die Winshoes (Freeware) einsetzen. Benutze ich selber erfolgreich.

        Hoffe dir geholfen zu haben

        Comment


        • #5
          Sorry, kleine Verwechslung:

          Auf deinem Server-PRG setzt du natürlich einen UDP-Client zum Senden und auf deinem Client-PRG einen UDP-Server zum Empfangen

          Comment


          • #6
            Wo gibt es die WinShoes ?
            Gruss,Uw

            Comment


            • #7
              Hallo,
              Habe das selbe Problem,dass wenn der Server nicht gestartet ist,
              ich die Fehlermeldung 10055 bekommen.
              Der Fehler tritt nach dem 249 mal 'TCPClient1.open' auf.

              TCPClient1.close wird nach jedem Error in der Ereignissrotiene von 'TCPClient1Error' aufgerufen

              Kurz bevor die Windows Error Meldung 10055 erscheint wird die Methode
              'onDisconnect' aufgerufen.

              Wer kann helfen

              Comment

              Working...
              X