Laden...

TcpListener Timeout

Letzter Beitrag vor 19 Jahren 10 Posts 5.258 Views
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.

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.

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.

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

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!?!?!?!

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.

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

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.

Hallo,

das Problem dürfte nun behoben sein.

Viele Grüße
Alexander

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();
...
}
}
...