MultiSocket: beim beenden hängt AcceptTcpClient



  • moin

    ich hab mir im inet n bissi was zu multisocket komunikation ergooglet ...
    hab das auch zum laufen bekommen

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Windows.Forms;
    using System.Threading;
    using System.Net;
    
    namespace NetCmdServer
    {
        public class NetCmdServer
        {
            public bool serverStartet = false;
            public string dataFromClient;
            public bool connect = false;
            private handleSever srv;
            public void Run(string ipadddr, int port)
            {
                int counter = 0;
                //Benutzung
    
                IPAddress ip = IPAddress.Parse(ipadddr);
                TcpListener inServerSocket = new TcpListener(ip, port);
                srv = new handleSever();
                srv.runmode = true;
                srv.startServer(inServerSocket, Convert.ToString(counter));
            }
    
            public bool SetRunMode(bool runmode) {
                if (srv != null)
                {
                    srv.runmode = runmode;
                }
                return true;
            }
    
            public string GetMessage()
            {
                string msg = "";
                if (srv != null)
                {
                    msg = srv.msgFromServer;
                    srv.msgFromServer = "";
                }
                return msg;
            }
    
            public class handleSever
            {
                public string msgFromServer = "";
                TcpListener serverSocket;
                string srvNo;
                public bool runmode = false;
    
                public void startServer(TcpListener inServerSocket, string slineNo)
                {
                    this.serverSocket = inServerSocket;
                    this.srvNo = slineNo;
                    Thread srvThread = new Thread(Server);
                    srvThread.Start();
                }
    
                public void Server()
                {
                    TcpClient clientSocket = default(TcpClient);
                    int counter = 0;
    
                    serverSocket.Start();
                    counter = 0;
                    msgFromServer = "";
                    while (runmode)
                    {
                        try
                        {
                            counter += 1;
                            clientSocket = serverSocket.AcceptTcpClient(); //problem
                            msgFromServer = " >> " + "Client No:" + Convert.ToString(counter) + " started!";
    
                            handleClinet client = new handleClinet();
                            client.startClient(clientSocket, Convert.ToString(counter));
                        }
                        catch (Exception ex)
                        {
                            System.Windows.Forms.MessageBox.Show(ex.ToString());
    
                        }
                    }
    
                    clientSocket.Close();
                    serverSocket.Stop();
    //                serverStartet = false;
                }
            }
    
            public class handleClinet
            {
                TcpClient clientSocket;
                string clNo;
                public void startClient(TcpClient inClientSocket, string clineNo)
                {
                    this.clientSocket = inClientSocket;
                    this.clNo = clineNo;
                    Thread ctThread = new Thread(doChat);
                    ctThread.Start();
                }
    
                private void doChat()
                {
                    int requestCount = 0;
                    byte[] bytesFrom = new byte[10025];
                    string dataFromClient = null;
                    Byte[] sendBytes = null;
                    string serverResponse = null;
                    string rCount = null;
                    requestCount = 0;
    
                    while ((true))
                    {
                        try
                        {
                            requestCount = requestCount + 1;
                            NetworkStream networkStream = clientSocket.GetStream();
                            networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                            dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                            dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                            Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient);
    
                            rCount = Convert.ToString(requestCount);
                            serverResponse = "Server to clinet(" + clNo + ") " + rCount;
                            sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                            networkStream.Write(sendBytes, 0, sendBytes.Length);
                            networkStream.Flush();
                            Console.WriteLine(" >> " + serverResponse);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(" >> " + ex.ToString());
                        }
                    }
                }
            } 
        }
    
    }
    

    soweit geht der code auch, aber wenn ich mein programm schliessen will hängt der an dieser zeile:
    clientSocket = serverSocket.AcceptTcpClient(); //problem

    ist ja auch klar denn AcceptTcpClient() blockiert ja den thread.
    nur wie kann ich den thread trotzdem schliessen ???

    mfg LT



  • if (serverSocket.Pending())
        clientSocket = serverSocket.AcceptTcpClient();
        ...
    }
    

    ^^ so gehts



  • Alles schon etwas länger her, also keine 100%-igen Aussagen:

    Es gibt Wege aber keiner davon ist wirklich schön und sauber.

    Deshalb vielleicht besser mit BeginAcceptTcpClient arbeiten, das tut nicht ganz so weh. Asynchrones-IO hat sowieso einige Vorteile.
    Jedenfalls kann "TcpListener serverSocket" dann jederzeit geschlossen werden (Close()).
    Wenn ich mich richtig erinnere Verursacht das einen letzten Aufruf des Callbacks von BeginAcceptTcpClient. Also im Callback darauf achten in welchem Zustand sich der Socket befindet.


Anmelden zum Antworten