Willkommen, Gast ( Anmelden | Registrierung )
Suche · Mitglieder · Kalender · Hilfe · Windows 7 Special
   
  Informationen
 

Zuständiger Moderator: Witi

Anzeige
C# Problem Beim Schliessen Eines Sockets
Zusätzlich zu den Tipps unten hilft eventuell ein Registry-Scan: Nervige Windows-Fehler lassen sich oft mit einem Aufräumen der Windows Registry beheben. In der Regel läuft und startet Windows danach auch wieder schneller!
Gratis System-Scan jetzt starten
 
Reply to this topicStart new topic
  C# Problem Beim Schliessen Eines Sockets
 
> C# Problem Beim Schliessen Eines Sockets
skelle
Beitrag 14.03.2010, 17:05
Beitrag #1


Gruppensymbol

WF-Fetischist
Beiträge: 695
Beigetreten: 15.07.2004




Hallo,
ich übertrage Daten zwischen 2 Sockets... geht auch einwandfrei.
Nur beim abbrechen eines Transfers habe ich ein Problem.
Wenn der SENDER den Dateiempfang abbricht bekommt der Empfänger das nicht mit...
Er bleibt hier hängen - also liest immer wieder 0 Bytes:
QUELLTEXT
while (red < t.Size)
                    {
                        tmp = t.Connection.readData(buffer);
                        red += tmp;
                        t.Transferred = red;
                        s.Write(buffer, 0, tmp);
                    }

Sollte nicht eigentlich eine Socketexception ausgelöst werden?
Wenn ich allerdings beim Empfänger abbreche, dann bekommen Sender und Empfänger eine Exception das der Socket geschlossen ist und alles ist ok.
Wieso klappt das nicht wenn der Sender abbricht?
Zum Verständnis:
Transfer bündelt alle Informationen zum Transfer wie z.b. Dateiname, Grösse etc und die Socketverbindung(Connection) an sich

Die Methode zum übertragen der Daten:
QUELLTEXT
private void transfer(Transfer t)
        {
            this.Transfers.Add(t);
            byte[] buffer = new byte[10 * 1024];

            this.tCalculate = new Thread(new ParameterizedThreadStart(calculateTransferSpeed));
            
            if (t.Incoming)
            {
                logger.log("Incoming: " + t.FileName);
                //Bestätigung des Empfangs senden
                t.Connection.writeText(Commands.Ok);
                logger.log("Incoming: Acceptet Transfer");

                //Empfang und speichern der Daten
                BufferedStream s=null;
                logger.log("Incoming: Starting receiving");
                try
                {
                    s = new BufferedStream(File.Open(t.Path, FileMode.Create), 2 * 1024 * 1024);
                    int tmp, red = 0;

                    this.tCalculate.Start(t);

                    while (red < t.Size)
                    {
                        tmp = t.Connection.readData(buffer);
                        red += tmp;
                        t.Transferred = red;
                        s.Write(buffer, 0, tmp);
                    }
                    logger.log("Incoming: Receiving done");
                }
                catch (Exception ex)
                {
                    exceptionThrown(ex);
                    logger.log("Incoming: Error while receiving");
                }
                finally
                {
                    t.Connection.disconnect();
                    this.tCalculate.Abort();
                    t.Speed = 0;
                    s.Close();
                    logger.log("Incoming: Resources closed");
                }
            }
            else
            {
                logger.log("Sending: " + t.FileName);
                //Verbindung aufbauen
                t.Connection = new Connection(t.Ip, t.Port);
                logger.log("Sending: Verbindung aufgebaut");

                t.Connection.writeText(Commands.Hello);
                if (t.Connection.readText().Equals(Commands.Hello))
                {
                    t.Connection.writeText(t.FileName);
                    t.Connection.writeText(Convert.ToString(t.Size));

                    if (t.Connection.readText().Equals(Commands.Ok))
                    {
                        BufferedStream s = null;
                        logger.log("Sending: Starting Data Transfer");
                        try
                        {
                             s = new BufferedStream(File.Open(t.Path, FileMode.Open), 2 * 1024 * 1024);
                            int tmp, written = 0;

                            this.tCalculate.Start(t);

                            while (written < t.Size)
                            {
                                tmp = s.Read(buffer, 0, buffer.Length);
                                t.Connection.writeData(buffer, tmp);
                                written += tmp;
                                t.Transferred = written;
                            }
                            logger.log("Sending: Sending ok");
                        }
                        catch(Exception ex)
                        {
                            exceptionThrown(ex);
                            logger.log("Sending: Error while sending");
                        }
                        finally
                        {
                            this.tCalculate.Abort();
                            t.Speed = 0;
                            s.Close();
                            t.Connection.disconnect();
                            logger.log("Sending: Reources closed");
                        }
                    }
                    else
                    {
                        t.Connection.disconnect();
                    }
                }
            }
        }


Abbrechen tue ich die Sache wie folgt (In der Connectioen welche zum Transfer gehört):
QUELLTEXT
public void disconnect()
        {
            try
            {
                this.socket.Shutdown(SocketShutdown.Both);
            }
            catch { }
            finally
            {
                this.socket.Close();
                this.connected = false;
            }
        }


--------------------
Profile Card PM Email Poster +ZitierenGo to the top of the page
bluefisch200
Beitrag 14.03.2010, 17:11
Beitrag #2


Gruppensymbol

WF-Senior
Beiträge: 703
Beigetreten: 28.01.2007




ZITAT
Wenn der SENDER den Dateiempfang abbricht bekommt der Empfänger das nicht mit...
Er bleibt hier hängen - also liest immer wieder 0 Bytes:

Ehm...frag halt ab wie viel er empfängt (Timeout machen) und dann reagierst du dementsprechend...


--------------------
Not the future we want - 1984 - "Think different" is bullshit
Profile Card PM +ZitierenGo to the top of the page
skelle
Beitrag 14.03.2010, 17:13
Beitrag #3


Gruppensymbol

WF-Fetischist
Beiträge: 695
Beigetreten: 15.07.2004




ja die überlegung hatte ich auch schon das wäre auf jeden fall mögich
aber mich würde trotzdem interessieren (u.a. um mehraufwand zu ersparen^^) wieso es nicht auf die von mir geplante weise geht smile.gif

greetz


--------------------
Profile Card PM Email Poster +ZitierenGo to the top of the page
bluefisch200
Beitrag 14.03.2010, 17:21
Beitrag #4


Gruppensymbol

WF-Senior
Beiträge: 703
Beigetreten: 28.01.2007




Ich denke die Implementierung wäre nicht unnötig da immer was so verlaufen kann dass die Verbindung nicht korrekt getrennt wird bzw. dies nicht bemerkt wird...

QUELLTEXT
while (red < t.Size || tmp != 0)
                    {
tmp = t.Connection.readData(buffer);
                        t.Transferred = red += tmp;
                        s.Write(buffer, 0, tmp);
                    }


Der Beitrag wurde von bluefisch200 bearbeitet: 14.03.2010, 17:23


--------------------
Not the future we want - 1984 - "Think different" is bullshit
Profile Card PM +ZitierenGo to the top of the page
skelle
Beitrag 14.03.2010, 17:23
Beitrag #5


Gruppensymbol

WF-Fetischist
Beiträge: 695
Beigetreten: 15.07.2004




ZITAT(bluefisch200 @ 14.03.2010, 17:21) *
Ich denke die Implementierung wäre nicht unnötig da immer was so verlaufen kann dass die Verbindung nicht korrekt getrennt wird bzw. dies nicht bemerkt wird...

QUELLTEXT
while (red < t.Size || tmp != 0)
                    {
                        t.Transferred = red += t.Connection.readData(buffer);
                        s.Write(buffer, 0, tmp);
                    }

das klappt schonmal nich ... tmp bekommt ja keinen werd von dir wink.gif

und auf tmp != 0 prüfen is au nich so gut
da es ja sein kann das die verbindung mal hängt oder so
da würde sich die sache mit dem timeout schon eher anbieten

greetz


--------------------
Profile Card PM Email Poster +ZitierenGo to the top of the page
bluefisch200
Beitrag 14.03.2010, 17:33
Beitrag #6


Gruppensymbol

WF-Senior
Beiträge: 703
Beigetreten: 28.01.2007




ZITAT
das klappt schonmal nich ... tmp bekommt ja keinen werd von dir

ja habe ich dann auch gesehen wink.gif

Ich kürze nur sehr gerne Code tongue.gif

Dann ist es doch mit Mehraufwand verbunden, leider...muss man sich wohl doch um das eigentliche Problem kümmern biggrin.gif


--------------------
Not the future we want - 1984 - "Think different" is bullshit
Profile Card PM +ZitierenGo to the top of the page
skelle
Beitrag 14.03.2010, 17:34
Beitrag #7


Gruppensymbol

WF-Fetischist
Beiträge: 695
Beigetreten: 15.07.2004




ZITAT(bluefisch200 @ 14.03.2010, 17:33) *
ja habe ich dann auch gesehen wink.gif

Ich kürze nur sehr gerne Code tongue.gif

Dann ist es doch mit Mehraufwand verbunden, leider...muss man sich wohl doch um das eigentliche Problem kümmern biggrin.gif


mal sehen ob noch wer anders seinen senf dazu gibt biggrin.gif


--------------------
Profile Card PM Email Poster +ZitierenGo to the top of the page
bluefisch200
Beitrag 14.03.2010, 17:50
Beitrag #8


Gruppensymbol

WF-Senior
Beiträge: 703
Beigetreten: 28.01.2007




Hmm...eigentlich existiert ja ein Timeout das man so kürzen können sollte http://msdn.microsoft.com/en-us/library/sy...ion(VS.71).aspx


--------------------
Not the future we want - 1984 - "Think different" is bullshit
Profile Card PM +ZitierenGo to the top of the page
skelle
Beitrag 14.03.2010, 17:59
Beitrag #9


Gruppensymbol

WF-Fetischist
Beiträge: 695
Beigetreten: 15.07.2004




ZITAT(bluefisch200 @ 14.03.2010, 17:50) *
Hmm...eigentlich existiert ja ein Timeout das man so kürzen können sollte http://msdn.microsoft.com/en-us/library/sy...ion(VS.71).aspx

hab den timeout mal auf 5 sekunden gesetzt ...
er hängt immernoch da er den timeout wohl beim aufruf von read den wert wohl zurücksetzt
was auch verständlich ist da er ja liest... er lieht ja eben nur "nichts" =/

edit: so problem ist gelöst.
der socket wirft keine socketexception ... sondern socket.connected geht false

lösung:
QUELLTEXT
public int readData(byte[] buffer)
        {
            if(this.socket.Available > 0)
                return this.socket.Receive(buffer);
            if(!this.socket.Connected)
                throw new Exception("Keine Verbindung");
            return 0;
        }


greetz smile.gif

Der Beitrag wurde von skelle bearbeitet: 14.03.2010, 18:21


--------------------
Profile Card PM Email Poster +ZitierenGo to the top of the page
bluefisch200
Beitrag 14.03.2010, 18:39
Beitrag #10


Gruppensymbol

WF-Senior
Beiträge: 703
Beigetreten: 28.01.2007




Dank dir, kommt in die persönliche Kopfschublade smile.gif


--------------------
Not the future we want - 1984 - "Think different" is bullshit
Profile Card PM +ZitierenGo to the top of the page
Reply to this topicStart new topic
1 Besucher lesen dieses Thema (Gäste: 1 | Anonyme Besucher: 0)
0 Mitglieder:
 
Haftungshinweis

RSS Vereinfachte Darstellung Aktuelles Datum: 30.07.2010, 18:21