Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Socket.Receive hängt beim 2. Aufruf
Somakia
myCSharp.de - Member



Dabei seit:
Beiträge: 288
Herkunft: Hessen

Themenstarter:

Socket.Receive hängt beim 2. Aufruf

beantworten | zitieren | melden

Ich habe nach der Anleitung von dieser Website hier
Simple Tcp Client ein Script erstellt... nunja, um ehrlich zu sein habe ich einfach den Quelltext kopiert und dann IP und Port angepasst. Nur damit hier niemand meckert "wah, nur kopieren, nix selbst machen, solche leute verstehen eh nich was sie da programmieren": ich verstehe ganz klar was ich da programmiere und habe nach dieser Vorlage auch ein Form erstellt gehabt was die Bedienung vereinfachen sollte... das Problem um welches hier trat zuerst da auf und deshalb hab ich einfach mal probiert ob es nun an meinem Code liegt oder nen allgemeiner Fehler ist...
leider ist es ein allgemeiner Fehler, nämlich der, dass sich das Script beim 2. Receive (unten in der While-Loop) einfach aufhängt
Ein Try-Catch an der entsprechenden Stelle lieferte keine Ergebnisse (er kommt nicht ins Catch da er sich ja beim Receive aufhängt)

Hier nochmal mein Code (der kopierte mit ersetzter IP Addy und ersetztem Port, sonst keine Unterschiede):


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SimpleTcpClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("XX.XX.XXX.XX";), 10011);

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.";);
Console.WriteLine(e.ToString());
return;
}


int recv = server.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);

while (true)
{
input = Console.ReadLine();
if (input == "exit";)
{
break;
}
server.Send(Encoding.ASCII.GetBytes(input));
data = new byte[1024];
recv = server.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Disconnecting from server...";);
server.Shutdown(SocketShutdown.Both);
server.Close();
}
}
}


Zur Info:
Bei dem Server handelt es sich auch nicht um eine selbst geschriebenes Programm sondern um einen TeamSpeak Server, deshalb ist die IP auch wegge-X-t
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Somakia am .
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

ich denke es handelt sich nicht um einen Fehler sondern um normales, dokumentiertes Verhalten (das hängt allerdings davon ab, wie der Server die Daten sendet).

Die Receive-Methode blockiert ja, wenn keine Daten anfallen, solange, bis das wieder der Fall ist.
Siehe auch den Absatz Hinweise in Socket.Receive-Methode.

Hast Du mal geschaut, wie Socket.Available aussieht vor dem Aufruf, der blockiert?
Ggf. könntest Du ein Socket.ReceiveTimeout setzen, dann sollte die Methode spätestens nach dessen Ablauf wieder zurückkehren.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Somakia
myCSharp.de - Member



Dabei seit:
Beiträge: 288
Herkunft: Hessen

Themenstarter:

beantworten | zitieren | melden

so langsam glaube ich, dass es zwar doch ein Fehler ist, dieser aber beim Server liegt.

mit Putty konnte ich erfolgreich eine Verbindung herstellen und darüber auch die Befehle senden.
Daher weiß ich auch: selbst wenn man vollkommenen Mist eingibt bekommt man zumindest die Antwort, dass der Befehl nicht bekannt ist...

hier ist das Problem nun, dass ich gar keine Daten zurückbekomme (wie du ja schon gesagt hast, socket.available = 0) und dann auch der Receive blockiert (der wartet ja auf Daten)

nur: wieso kommen über den socket keine Daten wenn ich doch ganz sicher weiß, dass da welche kommen müssten (wie gesagt, bei Putty bekomm ich vom server ne Meldung, dass der Befehl nicht bekannt ist)
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

Was sendest du an den Server?
Hast du dir mal angeschaut, was gesendet wird?
Ich Vermute, das du schlicht und einfach kein CR oder LF sendest, das der Server als Eingabeende auswertet.
Wenn du mit PUTTY etwas sendest, schliesst du die Eingabe ja auch mit Return ab ;)
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

@MartinH: Genau das muss der Grund sein. Hatte ich ganz übersehen, obwohl eigentlich ein Klassiker.

@Karill Endusa: Du schließt zwar Deine Eingabe vermutlich im eigenen Programm ebenfalls mit "Enter" ab, allerdings wird der Zeilenvorschub von Console.ReadLine nicht berücksichtigt -> er steckt nicht mit im eingelesenen String. Den müsstest Du also von Hand noch dranpappen.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Somakia
myCSharp.de - Member



Dabei seit:
Beiträge: 288
Herkunft: Hessen

Themenstarter:

beantworten | zitieren | melden

wargh xD
danke euch beiden, manchmal kanns so einfach sein dass man es einfach übersieht :D

Gefahr erkannt, Gefahr gebannt
private Nachricht | Beiträge des Benutzers