WinFuture-Forum.de: C# Problem Beim Schliessen Eines Sockets - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

C# Problem Beim Schliessen Eines Sockets


#1 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 14. März 2010 - 17:05

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:
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:
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):
public void disconnect()
		{
			try
			{
				this.socket.Shutdown(SocketShutdown.Both);
			}
			catch { }
			finally
			{
				this.socket.Close();
				this.connected = false;
			}
		}

0

Anzeige



#2 Mitglied ist offline   bluefisch200 

  • Gruppe: aktive Mitglieder
  • Beiträge: 718
  • Beigetreten: 28. Januar 07
  • Reputation: 0

geschrieben 14. März 2010 - 17:11

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...
Laptop: Apple Macbook / Intel Core 2 Duo 2.26 Ghz / 2 GB DDR3 / 250 GB HDD / nVidia 9400GT
Desktop: AMD "Dragon" / Phenom X4 955BE 3.2 Ghz / 8 GB DDR3 / 1 TB HDD + Intel X25 SSD / ATI 4870
Smartphone: SGS / Samsung Hummingbird 1 Ghz / 512 MB RAM / 2 GB Internal + 10 GB SD / SGX540
0

#3 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 14. März 2010 - 17:13

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 :)

greetz
0

#4 Mitglied ist offline   bluefisch200 

  • Gruppe: aktive Mitglieder
  • Beiträge: 718
  • Beigetreten: 28. Januar 07
  • Reputation: 0

geschrieben 14. März 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...

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

Dieser Beitrag wurde von bluefisch200 bearbeitet: 14. März 2010 - 17:23

Laptop: Apple Macbook / Intel Core 2 Duo 2.26 Ghz / 2 GB DDR3 / 250 GB HDD / nVidia 9400GT
Desktop: AMD "Dragon" / Phenom X4 955BE 3.2 Ghz / 8 GB DDR3 / 1 TB HDD + Intel X25 SSD / ATI 4870
Smartphone: SGS / Samsung Hummingbird 1 Ghz / 512 MB RAM / 2 GB Internal + 10 GB SD / SGX540
0

#5 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 14. März 2010 - 17:23

Beitrag anzeigenZitat (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...

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 :)

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
0

#6 Mitglied ist offline   bluefisch200 

  • Gruppe: aktive Mitglieder
  • Beiträge: 718
  • Beigetreten: 28. Januar 07
  • Reputation: 0

geschrieben 14. März 2010 - 17:33

Zitat

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

ja habe ich dann auch gesehen :)

Ich kürze nur sehr gerne Code :)

Dann ist es doch mit Mehraufwand verbunden, leider...muss man sich wohl doch um das eigentliche Problem kümmern :D
Laptop: Apple Macbook / Intel Core 2 Duo 2.26 Ghz / 2 GB DDR3 / 250 GB HDD / nVidia 9400GT
Desktop: AMD "Dragon" / Phenom X4 955BE 3.2 Ghz / 8 GB DDR3 / 1 TB HDD + Intel X25 SSD / ATI 4870
Smartphone: SGS / Samsung Hummingbird 1 Ghz / 512 MB RAM / 2 GB Internal + 10 GB SD / SGX540
0

#7 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 14. März 2010 - 17:34

Beitrag anzeigenZitat (bluefisch200: 14.03.2010, 17:33)

ja habe ich dann auch gesehen ;)

Ich kürze nur sehr gerne Code :)

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


mal sehen ob noch wer anders seinen senf dazu gibt :)
0

#8 Mitglied ist offline   bluefisch200 

  • Gruppe: aktive Mitglieder
  • Beiträge: 718
  • Beigetreten: 28. Januar 07
  • Reputation: 0

geschrieben 14. März 2010 - 17:50

Hmm...eigentlich existiert ja ein Timeout das man so kürzen können sollte http://msdn.microsof.../sy...ion(VS.71).aspx
Laptop: Apple Macbook / Intel Core 2 Duo 2.26 Ghz / 2 GB DDR3 / 250 GB HDD / nVidia 9400GT
Desktop: AMD "Dragon" / Phenom X4 955BE 3.2 Ghz / 8 GB DDR3 / 1 TB HDD + Intel X25 SSD / ATI 4870
Smartphone: SGS / Samsung Hummingbird 1 Ghz / 512 MB RAM / 2 GB Internal + 10 GB SD / SGX540
0

#9 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 14. März 2010 - 17:59

Beitrag anzeigenZitat (bluefisch200: 14.03.2010, 17:50)

Hmm...eigentlich existiert ja ein Timeout das man so kürzen können sollte http://msdn.microsof.../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:
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 :)

Dieser Beitrag wurde von skelle bearbeitet: 14. März 2010 - 18:21

0

#10 Mitglied ist offline   bluefisch200 

  • Gruppe: aktive Mitglieder
  • Beiträge: 718
  • Beigetreten: 28. Januar 07
  • Reputation: 0

geschrieben 14. März 2010 - 18:39

Dank dir, kommt in die persönliche Kopfschublade :)
Laptop: Apple Macbook / Intel Core 2 Duo 2.26 Ghz / 2 GB DDR3 / 250 GB HDD / nVidia 9400GT
Desktop: AMD "Dragon" / Phenom X4 955BE 3.2 Ghz / 8 GB DDR3 / 1 TB HDD + Intel X25 SSD / ATI 4870
Smartphone: SGS / Samsung Hummingbird 1 Ghz / 512 MB RAM / 2 GB Internal + 10 GB SD / SGX540
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0