views:

146

answers:

2

Hi all,

I have a number of C# software applications that are add-ins for a peice of software that has a .net API.

for software licensing purposes I'm required to have a license server. I've got this, at the moment this is what it does:

  • when a tool is run, it contacts the license server with its computer name and username
  • the server recieves this request, logs the request, and checks to see if the number of requests from that machien and or user have exceeded the preconfigured maximum (2 different licensing types)
  • it does this using an encrypted file which lists the time, machine name, username etc
  • if its ok, it returns OKAY response to the computer and the tool then runs
  • if it doesnt return anything or if it returns a not OK response the tool will not run (the software only runs for a short time, but is regulary ran, as opposed to opening for a long time)

This works great, except I'm having a problem that the server randomly crashes, and users can't get onto it.

This is the first client-server app I've done and I'm a bit in the dark (and feel like I'm re-inventing something which is commonly used), is there any good guides for creating something like that? My apps is very simple, I have a service running on the server looping listening on a TCP port, waiting for something to be sent.

    public void StartListening()
    {
        Listening = true;
        // Set the TcpListener on port 41616.
        Int32 port = 41616;
        IPAddress localAddr = IPAddress.Any;

        // TcpListener server = new TcpListener(port);
        server = new TcpListener(localAddr, port);
     // Start listening for client requests.
        server.Start();
        Listen();
    }

    public void Listen()
    {
        try
        {
            // Buffer for reading data
            Byte[] bytes = new Byte[256];
            String data = null;

            // Enter the listening loop.
            while (Listening)
            {
               TcpClient client = server.AcceptTcpClient();

                // 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);
                    Console.WriteLine("Received: {0}", data);

                    string returnData;
                    // Process the data sent by the client.
                    data = data.ToUpper();
                    byte[] msg = null;// DO STUFF BASED ON DATA
// set returnData to be the response (ie OKAY)
                  msg = System.Text.Encoding.ASCII.GetBytes(returnData);
// Send back a response.
                    stream.Write(msg, 0, msg.Length);
                    Console.WriteLine("Sent: {0}", returnData);
      // Shutdown and end connection
                client.Close();
            }

        }
        catch (Exception ex)
        {
           //LOG ERROR
        }
        finally
        {
            Listening = false;
            server.Stop();
        }

    }

I have a feeling the server is hanging somewhere on the decryption /encryption of the license log, as the server runs fine for a while then just stops, and if i re-create the license log it works. But thats not the point of this post (though any tips on why I'm getting this error:

Error occured: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) at BWSSLicenseServer.LicenseServer.Listen()

woudl be great)

My question is - how do I debug this easily in .NET? is there any good guides out there to help me? or is there any free framework for this? Should I be doing this code a totally different way (WCF, Web Service or something like that?)

A: 

It may be something to do with the object expiring. Try adding this to your server class:

    public override object InitializeLifetimeService()
    {
        return null;
    }
logicnp
A: 

ended up using CryptoLicensing as suggested in the comments

RodH257
why downvote this? what was I supposed to do?
RodH257