Search code examples
c#windows-servicestcpclienttcplistenerinstallutil

TCP IP Listener in windows Service


I'm trying to create a windows service that needs to run in the background and listen for incoming traffic (a normal and regular TCP listener)

my code is:

private TcpListener server;

public void startServer()
    {
       // EventLog.WriteEntry(source, "connected on: " + ipAddress.ToString() + " port: " + Service1.Port.ToString());

        server = new TcpListener(IPAddress.Parse("127.0.0.1"), Service1.Port);

         server.Start();
        while (true)
        {
          var client = server.AcceptTcpClient();


            new Thread(work).Start(client);

        }

 public void work(object client)
    {
        string msg = null;
        var clientLocal = (TcpClient)client;


            using (NetworkStream ns = clientLocal.GetStream())
            using (StreamReader sr = new StreamReader(ns))
            {
            byte[] msgFullArray = new UTF8Encoding(true).GetBytes(msg);
            fs.Write(msgFullArray, 0, msg.Length);
            }

now if you don't look at the work method at all as whenever i start my service it freezes whenever i try to start it at my :

 var client = server.AcceptTcpClient();

meaning my service never gets to use the Thread or my Work method.. i can see from previous logging that it enters my while loop and then just times out the service


Solution

  • In your OnStart Method you have to instantiate a server class.

    protected override void OnStart(string[] args)
    {
      // Create the Server Object ans Start it.
      server = new TCPServer();
      server.StartServer();
    }
    

    that is responsible to handle the connections to the server by creating a new Thread (so that it is a non-blocking process)

    public void StartServer()
    {
      if (m_server!=null)
      {
        // Create a ArrayList for storing SocketListeners before
        // starting the server.
        m_socketListenersList = new ArrayList();
    
        // Start the Server and start the thread to listen client 
        // requests.
        m_server.Start();
        m_serverThread = new Thread(new ThreadStart(ServerThreadStart));
        m_serverThread.Start();
    
        // Create a low priority thread that checks and deletes client
        // SocktConnection objcts that are marked for deletion.
        m_purgingThread = new Thread(new ThreadStart(PurgingThreadStart));
        m_purgingThread.Priority=ThreadPriority.Lowest;
        m_purgingThread.Start();
      }
    }
    

    for each socket that it will be listening by a TCPListener.

    private void ServerThreadStart()
    {
      // Client Socket variable;
      Socket clientSocket = null;
      TCPSocketListener socketListener = null;
      while(!m_stopServer)
      {
        try
        {
          // Wait for any client requests and if there is any 
          // request from any client accept it (Wait indefinitely).
          clientSocket = m_server.AcceptSocket();
    
          // Create a SocketListener object for the client.
          socketListener = new TCPSocketListener(clientSocket);
    
          // Add the socket listener to an array list in a thread 
          // safe fashon.
          //Monitor.Enter(m_socketListenersList);
          lock(m_socketListenersList)
          {
            m_socketListenersList.Add(socketListener);
          }
          //Monitor.Exit(m_socketListenersList);
    
          // Start a communicating with the client in a different
          // thread.
          socketListener.StartSocketListener();
        }
        catch (SocketException se)
        {
          m_stopServer = true;
        }
      }
    }
    

    Here it is the full project article.