c# service to listen to a port

14,816

Solution 1

As far as creating the Windows service itself, you should be able to use this link, even though it's dated. This companion link shows how to have the service install and uninstall itself. Finally, use this link to understand how to have your service run constantly and how to properly respond to start and stop commands.

To have your service interact with the socket, you'll want to modify the WorkerThreadFunc() from the last link. This is where you should start listening for and processing inbound socket connections.

Solution 2

As per MSDN, TcpServer.AcceptTcpClient blocks, so you're probably never returning from your Service's OnStart method, which causes the service to never actually "start".

You might consider using another thread and return from OnStart as soon as possible.

Cheers

Share:
14,816
dabuda
Author by

dabuda

Updated on June 04, 2022

Comments

  • dabuda
    dabuda almost 2 years

    I believe what I am looking to create is a service that listens to a specific port, and when data is sent to that port, it sends off that data to another script for processing.

    For some reason though, the service times out when I try to start it. My logs tells me TcpClient client = server.AcceptTcpClient(); is where it is stopping (actually, it is getting stuck on 'starting' in Services).

    Since I have no experience with C#, making services, or working with servers in this manner, the code is pretty much just what I found online.

    The OnStart method looks like this.

        protected override void OnStart(string[] args)
        {
            try
            {
                TcpListener server = null;
                // Set the TcpListener on port 13000.
                Int32 port = 1234;
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");
    
                // TcpListener server = new TcpListener(port);
                server = new TcpListener(localAddr, port);
    
                // Start listening for client requests.
                server.Start();
    
                // Buffer for reading data
                Byte[] bytes = new Byte[256];
                String data = null;
    
                // Enter the listening loop.
                while (true)
                {
                    // Perform a blocking call to accept requests.
                    // You could also user server.AcceptSocket() here.
                    TcpClient client = server.AcceptTcpClient();
    
                    data = null;
    
                    // Get a stream object for reading and writing
                    NetworkStream stream = client.GetStream();
    
                    int i;
    
                    // Loop to receive all the data sent by the client.
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        // Translate data bytes to a ASCII string.
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    
                        // Process the data sent by the client.
                        data = data.ToUpper();
    
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
    
                        // Send back a response.
                        stream.Write(msg, 0, msg.Length);
                    }
    
                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch (SocketException e)
            {
            }
            finally
            {
            }
        }
    
  • dabuda
    dabuda over 8 years
    Thank you very much. It seems to have worked. I am now off to fix the next error, lol.