Laden...

TcpListener Timeout

Erstellt von Illuvatar vor 19 Jahren Letzter Beitrag vor 19 Jahren 5.224 Views
I
Illuvatar Themenstarter:in
21 Beiträge seit 2004
vor 19 Jahren
TcpListener Timeout

Gibt es eine Möglichkeit, für die AcceptTcpClient - Methode einen Timeout zu setzen?

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

341 Beiträge seit 2004
vor 19 Jahren

Man könnte vielleicht mit einem Thread und DateTime versuchen, indem gekuckt wird ob sich ein Client in festgelegter Zeit anmgemeldet hat.

Also:

  1. Thread starten der guckt ob der TcpClient Object initialisiert wurde.
    1.1 In Thread-Funktion mit Klasse DateTime nach akt. Zeit abfragen und mit eigenen Timeout vergleichen.
  2. TcpClient client = TcpListener.AcceptTcpClient() starten, dieser läuft in eigenem Thread, glaube ich.
I
Illuvatar Themenstarter:in
21 Beiträge seit 2004
vor 19 Jahren

Ich versteh nicht ganz, was du meinst.
Meinst du, dass ich zusätzlich zur AcceptTcpClient() - Methode einen Thread starte, der auf das Timeout wartet? Und wie kann ich dann die AcceptTcpClient - Methode unterbrechen?

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

C
1.215 Beiträge seit 2004
vor 19 Jahren

einen neuen thread zu erstellen, sehe ich auch als einzige möglichkeit.

schau dir mal die methode Thread.Join() an - die blockiert den thread bis zu einem vorgegeben timeout-wert...

grtz
chief

341 Beiträge seit 2004
vor 19 Jahren

Das was ich vorgeschlagen habe ist nur eine Vermutung, aber du hast diese schon richtig verstanden.
Aber wie man die AcceptTcpClient()-Methode unterbricht, weis ich nicht, vielleicht aber mit einer Exception, die du dann auslöst wenn die Zeit überschritten ist!?!?!?!

I
Illuvatar Themenstarter:in
21 Beiträge seit 2004
vor 19 Jahren
Ok

Ja gut, dann probiere ich das so. Ich kann ja Thread#Join und Thread#Abort verwenden.

<offtopic>Ich mache halt hauptsächlich Java, und da kann ich bei einem ServerSocket einfach die Methode setSoTimeout verwenden, und die accept() - Methode bricht dann mit einer SocketTimeoutException ab... 😁 Und in Java kann Thread#Stop Speicherleaks verursachen, deshalb war ich da abgeneigt.</offtopic>

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

341 Beiträge seit 2004
vor 19 Jahren

Mit Close() kannst du die AcceptTcpClient()-Funktion der Klasse TcpListener beenden, wenn du die Exception in catch()-Block behandelst.

I
Illuvatar Themenstarter:in
21 Beiträge seit 2004
vor 19 Jahren

Ich mache das jetzt so:

while (!interrupted){
if (ss.Pending()){
TcpClient tc = ss.AcceptTcpClient();
...
}else{
Thread.Sleep (350);
}
}

### edit by alex ###
Anscheinend gibt es in diesem Thread einen Fehler (es kann keine Antwort erstellt werden). Ich bitte jeden, bei dem das Problem auftritt mir eine E-Mail oder private Nachricht zu schreiben.
Danke.

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

2.217 Beiträge seit 2003
vor 19 Jahren

Hallo,

das Problem dürfte nun behoben sein.

Viele Grüße
Alexander

U
1 Beiträge seit 2004
vor 19 Jahren
ExtTcpListener

Meiner Meinung nach eine bessere Lösung:


using System;

namespace System.Net.Sockets
{
  public class ExtTcpListener : System.Net.Sockets.TcpListener
  {
    [Obsolete("Use ExtTcpListener(IPAddress localaddr, int port).", false)]
    public ExtTcpListener(int port)
      : base(port)
    {
    }

    public ExtTcpListener(IPEndPoint localEP)
      : base(localEP)
    {
    }

    public ExtTcpListener(IPAddress localaddr, int port)
      : base(localaddr, port)
    {
    }

    public bool Pending(int microSeconds)
    {
      if (!this.Active)
        throw new InvalidOperationException("server not active");
      return this.Server.Poll(microSeconds, SelectMode.SelectRead);
    }
  }
}

...
ExtTcpListener ss = new ExtTcpListener(...);
while (!interrupted){
if (ss.Pending(350)){
TcpClient tc = ss.AcceptTcpClient();
...
}
}
...