代码之家  ›  专栏  ›  技术社区  ›  Benny

Silverlight套接字总是返回空缓冲区

  •  0
  • Benny  · 技术社区  · 14 年前

    我正在使用Silverlight与我开发的代理应用程序交互,但如果代理不向Silverlight应用程序发送消息,它将使用空缓冲区(“\0”)执行接收完成的处理程序。我做错什么了吗?它造成了 专业 内存泄漏。

    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();
        }
    
    }
    

    事先谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Chris Taylor    14 年前

    我想第二个代码块是您的 ReceiveComplete 处理程序。如果是这样,你应该看看 SocketAsyncEventArgs.BytesTransferred 属性获取接收的字节数。