TcpListener.AcceptClient() abbrechen

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    TcpListener.AcceptClient() abbrechen

    hoi,

    in einem thread wird tcpListener.AcceptClient() aufgerufen, diese methode wartet nun auf einen client, aber wie kann ich dieses warten auf einen client abbrechen?
    ich würde gerne per software eine gewisse zeit die "türen" aufmachen und dann wieder schließen - so ähnlich wie bei bluetooth - man ist nur für gewisse zeit sichtbar sozusagen.

    hier mal meine terminal classe

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Net;
    7. using System.Net.Sockets;
    8. using System.Threading;
    9. namespace Terminal
    10. {
    11. class Terminal
    12. {
    13. private TcpListener tcpListener;
    14. private Thread listenThread;
    15. private List<TcpClient> clientList;
    16. public Terminal()
    17. {
    18. this.clientList = new List<TcpClient>();
    19. this.tcpListener = new TcpListener(IPAddress.Any, 975);
    20. this.listenThread = new Thread(new ThreadStart(listenForClients));
    21. this.listenThread.Start();
    22. }
    23. public void startListening() {
    24. }
    25. public void stopListening()
    26. {
    27. }
    28. private void listenForClients()
    29. {
    30. // TCP Server starten
    31. this.tcpListener.Start();
    32. while (true)
    33. {
    34. TcpClient client = this.tcpListener.AcceptTcpClient();
    35. this.clientList.Add(client);
    36. Thread clientThread = new Thread(new ParameterizedThreadStart(handleClientCommunication));
    37. clientThread.Start(client);
    38. }
    39. }
    40. private void handleClientCommunication(object client)
    41. {
    42. TcpClient tcpClient = (TcpClient)client;
    43. NetworkStream clientStream = tcpClient.GetStream();
    44. byte[] message = new byte[4096];
    45. int bytesRead;
    46. while (true)
    47. {
    48. bytesRead = 0;
    49. try
    50. {
    51. bytesRead = clientStream.Read(message, 0, 4096);
    52. }
    53. catch
    54. {
    55. // socket error
    56. break;
    57. }
    58. if (bytesRead == 0)
    59. {
    60. // Client hat die Verbindung getrennt
    61. break;
    62. }
    63. // Nachricht vom Client empfangen
    64. ASCIIEncoding encoder = new ASCIIEncoding();
    65. string clientMessage = encoder.GetString(message, 0, bytesRead);
    66. }
    67. tcpClient.Close();
    68. }
    69. }
    70. }
    Am einfachsten tust du dir wenn du einfach mit tcpListener.Pending() überprüfst ob sich überhaupt jemand verbinden will. Und nur dann rufst du AcceptTcpClient auf.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    ich hab aber das problem, dass der client immer wieder versucht zu verbinden, sogar wenn ich client.close() mache versucht er einfach wieder zu verbinden... ?
    es gäbe natürlich die möglichkeit dem client eine nachricht zu senden und somit dann der client aufhört zu verbinden, aber ist das eine gute lösung? würde 1. bevorzugen...

    C#-Quellcode

    1. private void listenForClients()
    2. {
    3. // TCP Server starten
    4. this.tcpListener.Start();
    5. while (true)
    6. {
    7. if (this.tcpListener.Pending())
    8. {
    9. TcpClient client = this.tcpListener.AcceptTcpClient();
    10. if (this.open) {
    11. MessageBox.Show("O");
    12. this.clientList.Add(new TerminalClient(client));
    13. Thread clientThread = new Thread(new ParameterizedThreadStart(handleClientCommunication));
    14. clientThread.Start(client);
    15. }
    16. else { client.Close(); MessageBox.Show("Closed"); }
    17. }
    18. }
    19. }