private void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                Byte[] payload = _serverSocket.EndReceive(ar, ref _localEP);

                IdentifyMessageType(payload);
                if (_messageType == null || _messageType.Value == ChoNetMessageType.Raw)
                {
                    EventHandler <ChoNetMessageEventArgs> rawMessageReceived = RawMessageReceived;
                    if (rawMessageReceived != null)
                    {
                        rawMessageReceived(this, new ChoNetMessageEventArgs(null, payload));
                    }
                }
                else if (_messageType.Value == ChoNetMessageType.Xml)
                {
                    try
                    {
                        ChoNetMessage msg = (ChoNetMessage)_encoding.GetString(payload).ToObjectFromXml(); // ChoObject.XmlDeserialize<ChoNetMessage>(_encoding.GetString(payload));
                        if (!PreProcessMessage(msg))
                        {
                            EventHandler <ChoNetMessageEventArgs> messageReceived = MessageReceived;
                            if (messageReceived != null)
                            {
                                messageReceived(this, new ChoNetMessageEventArgs(msg, null));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        ChoTrace.Error(ex.ToString());
                    }
                }
                else if (_messageType.Value == ChoNetMessageType.Binary)
                {
                    try
                    {
                        ChoNetMessage msg = (ChoNetMessage)ChoObject.Deserialize(payload);
                        if (!PreProcessMessage(msg))
                        {
                            EventHandler <ChoNetMessageEventArgs> messageReceived = MessageReceived;
                            if (messageReceived != null)
                            {
                                messageReceived(this, new ChoNetMessageEventArgs(msg, null));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        ChoTrace.Error(ex.ToString());
                    }
                }
            }
            finally
            {
                _recieveResult = _serverSocket.BeginReceive(ReceiveCallback, null);
            }
        }
        protected virtual bool PreProcessMessage(ChoNetMessage msg)
        {
            if (msg is ChoPingNetMessage)
            {
                if (IsServer)
                {
                    return(true);
                }
                else
                {
                    _lastPingMsgArrived = msg.TimeStamp;
                    //IsServerAvailable = true;
                    return(true);
                }
            }

            return(false);
        }
 private byte[] ConvertToBytes(ChoNetMessage obj)
 {
     if (_messageType == ChoNetMessageType.Xml)
     {
         return(_encoding.GetBytes(obj.ToNullNSXmlWithType()));
     }
     else if (_messageType == ChoNetMessageType.Binary)
     {
         return(ChoObject.Serialize(obj));
     }
     else
     {
         if (SerializePayload != null)
         {
             return(SerializePayload(obj.Payload));
         }
         else
         {
             return(null);
         }
     }
 }
        private void IdentifyMessageType(byte[] payload)
        {
            if (_identifiedMessageType)
            {
                return;
            }

            try
            {
                if (_messageType == null)
                {
                    _messageType = ChoNetMessageType.Raw;
                    try
                    {
                        ChoNetMessage scalarObject = (ChoNetMessage)ChoObject.Deserialize(payload);
                        _messageType = ChoNetMessageType.Binary;
                    }
                    catch
                    {
                        try
                        {
                            ChoNetMessage scalarObject = (ChoNetMessage)(ChoNetMessage)_encoding.GetString(payload).ToObjectFromXml(); // ChoObject.XmlDeserialize<ChoNetMessage>(_encoding.GetString(payload));
                            _messageType = ChoNetMessageType.Xml;
                        }
                        catch
                        {
                            Trace.WriteLine("Failed to identity message type. Setting the message format as raw payload mode.");
                        }
                    }
                }
            }
            finally
            {
                _identifiedMessageType = true;
            }
        }
 public ChoNetMessageEventArgs(ChoNetMessage message, byte[] rawMessage)
 {
     Message    = message;
     RawPayload = rawMessage;
 }