Laden...

Socket.Receive hängt beim 2. Aufruf

Erstellt von Somakia vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.007 Views
S
Somakia Themenstarter:in
269 Beiträge seit 2010
vor 13 Jahren
Socket.Receive hängt beim 2. Aufruf

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

3.170 Beiträge seit 2006
vor 13 Jahren

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

S
Somakia Themenstarter:in
269 Beiträge seit 2010
vor 13 Jahren

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)

185 Beiträge seit 2005
vor 13 Jahren

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 😉

3.170 Beiträge seit 2006
vor 13 Jahren

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

S
Somakia Themenstarter:in
269 Beiträge seit 2010
vor 13 Jahren

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

Gefahr erkannt, Gefahr gebannt