views:

27

answers:

1

I am using Silverlight to interact with a proxy application that I have developed but, without the proxy sending a message to the Silverlight application, it executes the receive completed handler with an empty buffer ('\0's). Is there something I'm doing wrong? It is causing a major memory leak.

this._rawBuffer = new Byte[this.BUFFER_SIZE];
SocketAsyncEventArgs receiveArgs = new SocketAsyncEventArgs();
receiveArgs.SetBuffer(_rawBuffer, 0, _rawBuffer.Length);
receiveArgs.Completed += new EventHandler<SocketAsyncEventArgs>(ReceiveComplete);
this._client.ReceiveAsync(receiveArgs);

if (args.SocketError == SocketError.Success && args.LastOperation == SocketAsyncOperation.Receive)
{
    // Read the current bytes from the stream buffer
    int bytesRecieved = this._client.ReceiveBufferSize;
    // If there are bytes to process else the connection is lost
    if (bytesRecieved > 0)
    {
        try
        {
            //Find out what we just received
            string messagePart = UTF8Encoding.UTF8.GetString(_rawBuffer, 0, _rawBuffer.GetLength(0));
            //Take out any trailing empty characters from the message
            messagePart = messagePart.Replace('\0'.ToString(), "");
            //Concatenate our current message with any leftovers from previous receipts
            string fullMessage = _theRest + messagePart;
            int seperator;

            //While the index of the seperator (LINE_END defined & initiated as private member)
            while ((seperator = fullMessage.IndexOf((char)Messages.MessageSeperator.Terminator)) > 0)
            {
                //Pull out the first message available (up to the seperator index
                string message = fullMessage.Substring(0, seperator);
                //Queue up our new message
                _messageQueue.Enqueue(message);
                //Take out our line end character
                fullMessage = fullMessage.Remove(0, seperator + 1);
            }

            //Save whatever was NOT a full message to the private variable used to store the rest
            _theRest = fullMessage;

            //Empty the queue of messages if there are any
            while (this._messageQueue.Count > 0)
            {
                ...
            }
        }
        catch (Exception e)
        {
            throw e;
        }
        // Wait for a new message

        if (this._isClosing != true)
            Receive();
    }

}

Thanks in advance.

A: 

I assume the second block of code is your ReceiveComplete handler. If so, you should be looking at the SocketAsyncEventArgs.BytesTransferred property to get the count of the bytes received.

Chris Taylor
Thank you!! Simple mistakes at their finest!
Benny