tags:

views:

150

answers:

1

Hi all, I wrote a small socket listener windows service based on MSDN example.(http://msdn.microsoft.com/en-us/library/fx6588te%28VS.85%29.aspx). I was able to send the data and receive it only one time, Next time I need to send I have to uninstall and reinstall the service.

public class AsynchronousSocketListener
{
    public static ManualResetEvent allDone = new ManualResetEvent(false);

    //Default member
    public AsynchronousSocketListener()
    {
        //StartListening(); 
    }

    /////////////// Start Listen , this is called on the Service OnStart Event.
    public void StartListening()
    {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket.
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");//199.196.62.55            
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        // Bind the socket to the local endpoint and listen for incoming connections.
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10);

            while (true)
            {
                // Set the event to nonsignaled state.
                allDone.Reset();

                // Start an asynchronous socket to listen for connections.
                //Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);

                // Wait until a connection is made before continuing.
                allDone.WaitOne(6);
            }

        }
        catch (Exception e)
        {
            //Console.WriteLine(e.ToString());
        }               
    }
    /////////////////////////////////END StartListening /////////////////////////////////////

    public static void AcceptCallback(IAsyncResult ar)
    {
        // Signal the main thread to continue.
        allDone.Set();            

        // Get the socket that handles the client request.
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);

        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = handler;
        handler.BeginReceive(state.buffer, 0, StateObject.Buffersize, 0,
            new AsyncCallback(ReadCallback), state);
    }

    ////////////////////////////////////// END AcceptCallback///////////////////////////////

    public static void ReadCallback(IAsyncResult ar)
    {
        String content = String.Empty;

        // Retrieve the state object and the handler socket
        // from the asynchronous state object.
        StateObject state = (StateObject)ar.AsyncState;
        Socket handler = state.workSocket;

        // Read data from the client socket. 
        int bytesRead = handler.EndReceive(ar);

        if (bytesRead > 0)
        {
            // There  might be more data, so store the data received so far.
            state.sb.Append(Encoding.ASCII.GetString(
                state.buffer, 0, bytesRead));

            // Check for end-of-file tag. If it is not there, read 
            // more data.
            content = state.sb.ToString();
            if (content.IndexOf("<EOF>") > -1)
            {
                // All the data has been read from the 
                // client. Display it on the console.
                //Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                    //content.Length, content);
                // Echo the data back to the client.
                Send(handler, content);

            }
            else
            {
                // Not all data received. Get more.
                handler.BeginReceive(state.buffer, 0, StateObject.Buffersize, 0,
                new AsyncCallback(ReadCallback), state);
            }
        }
    }

    /////////////////////////////////// END ReadCallback ///////////////////////////////////////

    private static void Send(Socket handler, String data)
    {
        // Convert the string data to byte data using ASCII encoding.
        byte[] byteData = Encoding.ASCII.GetBytes(data);
        string parseReturnVal=string.Empty;
        if (data != null)
        {
            ReceiveData receiveDatatoParse = new ReceiveData();
            parseReturnVal = receiveDatatoParse.ParseHL7(data);
        }

        // Begin sending Ack data to the remote device.
        if (parseReturnVal == "false")
        {
            //For some reason, Parsing failed.Shut Down the Socket.
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();

        }
        else
        {
            byte[] ackData = Encoding.ASCII.GetBytes(parseReturnVal);
            handler.BeginSend(ackData, 0, ackData.Length, 0,
                new AsyncCallback(SendCallback), handler);
        }

    }

    //////////////////////////////////// END Send /////////////////////////////////////////////

    private static void SendCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.
            Socket handler = (Socket)ar.AsyncState;

            // Complete sending the data to the remote device.
            int bytesSent = handler.EndSend(ar);
            //Console.WriteLine("Sent {0} bytes to client.", bytesSent);

            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
            //allDone.Close();

        }
        catch (Exception e)
        {
            //Console.WriteLine(e.ToString());
        }
    }
}

Not Sure what I am doing wrong.

A: 

where is it stuck - have you looked with VS debugger?

pm100
It is not getting stuck anywhere...It just does not invoke or step into the StartListening on the second run. Do u want me to send you the client piece of this code?
Ranjit