Laden...

Kann das Blockieren von Socket.Accept() umgangen werden?

Erstellt von Frokuss vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.017 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 5 Jahren
Kann das Blockieren von Socket.Accept() umgangen werden?

Wunderschönen gute Tag!

Kurz die Fragestellung: Kann ich das Blockieren von Socket.Accept() irgendwie umgehen?

Der Hintergrund ist wie folgt... Ich würde gerne meine Server-Consolen-Anwendung über die Console beenden... Nun habe ich allerdings festgestellt, dass der Thread, der die ganzen Verbindungen annimmt, genau an der Stelle des Accept blockiert (Was auch die Literatur wiedergibt). Und genau das Blockieren verhindert das ordnungsgemäße beenden des Servers.

Muss ich daher den Weg über Socket.BeginnAccept() gehen? Oder kann ich einen Timer irgendwie setzen? Und wenn ja, wäre das überhaupt der sinnvolle weg?


lauscher = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
			try{
				lauscher.Bind(ep);
				lauscher.Listen(100);

				while(!_beenden){
					Console.WriteLine("in while..");

					anwenderGeraet.Add(lauscher.Accept());
					Console.WriteLine("eingehender Anruf :-)");
					
					Thread.Sleep(50);
				}
				Console.WriteLine("Verbindung.cs: beendet..");
			}
			catch(Exception ex){
				Console.WriteLine("Fehler: " + ex);
			}

Gruß Frokuss

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 5 Jahren

Okay, ich danke euch für eure Hilfe XD

if(lauscher.Poll(10, SelectMode.SelectRead)){

Jetzt muss ich nur noch die feinheiten zwischen den SelectModes verstehen... Aber zumindestens sieht es jetzt besser aus 😃

Gruß Frokuss

16.841 Beiträge seit 2008
vor 5 Jahren

Korrekt würde es mit AcceptAsync funktionieren.
Alternativ BeginAccept (mit EndAccept). Dies sind asynchrone Pattern, die cancelbar sind.