コード例 #1
0
        protected override byte[] SerializeMessage(IScsMessage message)
        {
            var bytes = base.SerializeMessage(message);
            if (compress) bytes = CompressionManager.CompressGZip(bytes);
            if (encrypt) bytes = XXTEA.Encrypt(bytes, keys);

            return bytes;
        }
コード例 #2
0
ファイル: WireProtocol.cs プロジェクト: aerzy/OpenNos
        public byte[] GetBytes(IScsMessage message)
        {
            //Serialize the message to a byte array
            byte[] bytes = message is ScsTextMessage ? 
                Encoding.Default.GetBytes(((ScsTextMessage)message).Text) :
                ((ScsRawDataMessage)message).MessageData;

            return bytes;
        }
コード例 #3
0
 /// <summary>
 /// Overrides
 ///
 /// </summary>
 /// <param name="message"/>
 protected override void OnMessageReceived(IScsMessage message)
 {
     lock (this._receivingMessageQueue)
     {
         if (this._receivingMessageQueue.Count < this.IncomingMessageQueueCapacity)
         {
             this._receivingMessageQueue.Enqueue(message);
         }
         this._receiveWaiter.Set();
     }
 }
コード例 #4
0
 /// <summary>
 ///     Sends a message to the remote application.
 /// </summary>
 /// <param name="message">Message to be sent</param>
 /// <param name="priority">Priority of message to send</param>
 protected override void SendMessagepublic(IScsMessage message, byte priority)
 {
     if (priority > 5)
     {
         _highPriorityBuffer.Enqueue(WireProtocol.GetBytes(message));
     }
     else
     {
         _lowPriorityBuffer.Enqueue(WireProtocol.GetBytes(message));
     }
 }
コード例 #5
0
        /// <summary>
        /// This method is used to receive a specific type of message from remote application. It
        /// waits until a message is received or timeout occurs.
        /// </summary>
        /// <typeparam name="TMessage"></typeparam>
        /// <param name="timeout">
        /// Timeout value to wait if no message is received. Use -1 to wait indefinitely.
        /// </param>
        /// <returns>Received message</returns>
        public TMessage ReceiveMessage<TMessage>(int timeout) where TMessage : IScsMessage
        {
            IScsMessage receivedMessage = ReceiveMessage(timeout);
            if (!(receivedMessage is TMessage))
            {
                throw new Exception("Unexpected message received." +
                                    " Expected type: " + typeof(TMessage).Name +
                                    ". Received message type: " + receivedMessage.GetType().Name);
            }

            return (TMessage)receivedMessage;
        }
コード例 #6
0
 public byte[] GetBytes(IScsMessage message)
 {
     try
     {
         Cmd cmd = message as Cmd;
         return(_packer.pack(cmd).ToArray());
     }
     catch
     {
         return(null);
     }
 }
コード例 #7
0
        protected override byte[] SerializeMessage(IScsMessage message)
        {
            byte msgTypeCodec = Convert.ToByte((int)MsgType.UnType_Msg);

            byte [] bytMsgId      = new byte [ConstData.tokenStringLength];
            byte [] bytReplyMsgId = new byte [ConstData.tokenStringLength];
            if (false == string.IsNullOrEmpty(message.MessageId))
            {
                bytMsgId = Encoding.ASCII.GetBytes(message.MessageId);
            }
            else
            {
                bytMsgId = Encoding.ASCII.GetBytes(ConstData.emptyGuidString);
            }

            if (false == string.IsNullOrEmpty(message.RepliedMessageId))
            {
                bytReplyMsgId = Encoding.ASCII.GetBytes(message.RepliedMessageId);
            }
            else
            {
                bytReplyMsgId = Encoding.ASCII.GetBytes(ConstData.emptyGuidString);
            }

            byte[] content = null;

            if (message is ScsRawDataMessage)
            {
                msgTypeCodec = (byte)MsgType.ScsRaw_Msg;
                content      = new byte[((ScsRawDataMessage)message).MessageData.Length];
                Buffer.BlockCopy(((ScsRawDataMessage)message).MessageData, 0, content, 0, content.Length);
            }
            else if (message is ScsTextMessage)
            {
                msgTypeCodec = (byte)MsgType.ScsText_Msg;
                content      = Encoding.UTF8.GetBytes(((ScsTextMessage)message).Text);
            }
            else if (message is ScsPingMessage)
            {
                msgTypeCodec = (byte)MsgType.ScsPing_Msg;
            }

            byte [] finalMsg = new byte [1 + ConstData.tokenStringLength * 2 + ((null != content)?(content.Length):(0))];
            finalMsg[0] = msgTypeCodec;
            Buffer.BlockCopy(bytMsgId, 0, finalMsg, 1, ConstData.tokenStringLength);
            Buffer.BlockCopy(bytReplyMsgId, 0, finalMsg, 1 + ConstData.tokenStringLength, ConstData.tokenStringLength);
            if (null != content)
            {
                Buffer.BlockCopy(content, 0, finalMsg, 1 + ConstData.tokenStringLength * 2, content.Length);
            }

            return(finalMsg);
        }
コード例 #8
0
 public byte[] GetBytes(IScsMessage message)
 {
     try
     {
         Cmd cmd = message as Cmd;
         return _packer.pack(cmd).ToArray();
     }
     catch
     {
         return null;
     }
 }
コード例 #9
0
ファイル: SynchronizedMessenger.cs プロジェクト: tbs005/Temu
        /// <summary>
        /// This method is used to receive a specific type of message from remote application.
        ///             It waits until a message is received or timeout occurs.
        ///
        /// </summary>
        /// <param name="timeout">Timeout value to wait if no message is received.
        ///             Use -1 to wait indefinitely.
        ///             </param>
        /// <returns>
        /// Received message
        /// </returns>
        public TMessage ReceiveMessage <TMessage>(int timeout) where TMessage : IScsMessage
        {
            IScsMessage scsMessage = this.ReceiveMessage(timeout);

            if (!(scsMessage is TMessage))
            {
                throw new Exception("Unexpected message received. Expected type: " + typeof(TMessage).Name + ". Received message type: " + scsMessage.GetType().Name);
            }
            else
            {
                return((TMessage)scsMessage);
            }
        }
コード例 #10
0
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 /// </summary>
 /// <param name="requestMessage">Request message</param>
 /// <param name="returnValue">Return value to send</param>
 /// <param name="exception">Exception to send</param>
 private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         _requestReplyMessenger.SendMessage(new ScsRemoteInvokeReturnMessage {
             RepliedMessageId = requestMessage.MessageId, ReturnValue = returnValue, RemoteException = exception
         });
     }
     catch (Exception ex)
     {
         _log.Error($"Exception:'{ex}',Message:'{ex.Message}',StackTrace:'{ex.StackTrace}'");
     }
 }
コード例 #11
0
 public byte[] GetBytes(IScsMessage message)
 {
     var m = message as Protocols.GpsMessage;
     List<byte> bytes = new List<byte>();
     logger.Debug("Data {0}", BitConverter.ToString(m.Data));
     if (m.Data != null)
     {
         bytes.Add(0x02);
         bytes.Add(m.Data[m.Data.Length - 2]);
         bytes.Add(m.Data[m.Data.Length - 1]);
         m.Data = bytes.ToArray();
     }
     return bytes.ToArray();
 }
コード例 #12
0
ファイル: EzUdpPeer.cs プロジェクト: HowieXue/Hospital_projs
 public void SendMessage(IPEndPoint remote, IScsMessage msg)
 {
     try
     {
         byte[] buffer = this.WireProtocol.GetBytes(msg);
         if (buffer != null)
             _udp_peer.SendData(buffer, remote);
     }
     catch (System.Exception ex)
     {
         EzLogger.GlobalLogger.warning(string.Format("{0}{2}{1}{2}",
             ex.Message, ex.StackTrace, Environment.NewLine));
     }
 }
コード例 #13
0
        /// <summary>
        /// Handles MessageReceived event of _communicationChannel object.
        /// </summary>
        /// <param name="sender">Source of event</param>
        /// <param name="e">Event arguments</param>
        private void CommunicationChannel_MessageReceived(object sender, MessageEventArgs e)
        {
            IScsMessage message = e.Message;

            if (message is ScsPingMessage)
            {
                _communicationChannel.SendMessage(new ScsPingMessage {
                    RepliedMessageId = message.MessageId
                }, 10);
                return;
            }

            OnMessageReceived(message);
        }
コード例 #14
0
        protected override byte[] SerializeMessage(IScsMessage message)
        {
            var bytes = base.SerializeMessage(message);

            if (compress)
            {
                bytes = CompressionManager.CompressGZip(bytes);
            }
            if (encrypt)
            {
                bytes = XXTEA.Encrypt(bytes, keys);
            }

            return(bytes);
        }
コード例 #15
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        /// <exception cref="ArgumentNullException">Throws ArgumentNullException if message is null</exception>
        public void SendMessage(IScsMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            try
            {
                SendMessageInternal(message);
            }
            catch (ObjectDisposedException)
            {
            }
        }
コード例 #16
0
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 ///
 /// </summary>
 /// <param name="requestMessage">Request message</param><param name="returnValue">Return value to send</param><param name="exception">Exception to send</param>
 private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         RequestReplyMessenger <IScsClient> requestReplyMessenger = this._requestReplyMessenger;
         ScsRemoteInvokeReturnMessage       invokeReturnMessage1  = new ScsRemoteInvokeReturnMessage();
         invokeReturnMessage1.RepliedMessageId = requestMessage.MessageId;
         invokeReturnMessage1.ReturnValue      = returnValue;
         invokeReturnMessage1.RemoteException  = exception;
         ScsRemoteInvokeReturnMessage invokeReturnMessage2 = invokeReturnMessage1;
         requestReplyMessenger.SendMessage((IScsMessage)invokeReturnMessage2);
     }
     catch
     {
     }
 }
コード例 #17
0
 public void SendMessage(IPEndPoint remote, IScsMessage msg)
 {
     try
     {
         byte[] buffer = this.WireProtocol.GetBytes(msg);
         if (buffer != null)
         {
             _udp_peer.SendData(buffer, remote);
         }
     }
     catch (System.Exception ex)
     {
         EzLogger.GlobalLogger.warning(string.Format("{0}{2}{1}{2}",
                                                     ex.Message, ex.StackTrace, Environment.NewLine));
     }
 }
コード例 #18
0
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 ///
 /// </summary>
 /// <param name="client">Client that sent invoke message</param><param name="requestMessage">Request message</param><param name="returnValue">Return value to send</param><param name="exception">Exception to send</param>
 private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         IMessenger messenger = client;
         ScsRemoteInvokeReturnMessage invokeReturnMessage1 = new ScsRemoteInvokeReturnMessage();
         invokeReturnMessage1.RepliedMessageId = requestMessage.MessageId;
         invokeReturnMessage1.ReturnValue      = returnValue;
         invokeReturnMessage1.RemoteException  = exception;
         ScsRemoteInvokeReturnMessage invokeReturnMessage2 = invokeReturnMessage1;
         messenger.SendMessage((IScsMessage)invokeReturnMessage2);
     }
     catch
     {
     }
 }
コード例 #19
0
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 /// </summary>
 /// <param name="client">Client that sent invoke message</param>
 /// <param name="requestMessage">Request message</param>
 /// <param name="returnValue">Return value to send</param>
 /// <param name="exception">Exception to send</param>
 private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         client.SendMessage(
             new ScsRemoteInvokeReturnMessage
         {
             RepliedMessageId = requestMessage.MessageId,
             ReturnValue      = returnValue,
             RemoteException  = exception
         }, 10);
     }
     catch
     {
     }
 }
コード例 #20
0
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 /// </summary>
 /// <param name="client">Client that sent invoke message</param>
 /// <param name="requestMessage">Request message</param>
 /// <param name="returnValue">Return value to send</param>
 /// <param name="exception">Exception to send</param>
 private static void SendInvokeResponse(IMessenger client, IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         client.SendMessage(new ScsRemoteInvokeReturnMessage
         {
             RepliedMessageId = requestMessage.MessageId,
             ReturnValue      = returnValue,
             RemoteException  = exception
         }, 10);
     }
     catch (Exception ex)
     {
         Logger.Log.Error("Invoke response send failed", ex);
     }
 }
コード例 #21
0
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 /// </summary>
 /// <param name="requestMessage">Request message</param>
 /// <param name="returnValue">Return value to send</param>
 /// <param name="exception">Exception to send</param>
 private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         _requestReplyMessenger.SendMessage(
             new ScsRemoteInvokeReturnMessage
         {
             RepliedMessageId = requestMessage.MessageId,
             ReturnValue      = returnValue,
             RemoteException  = exception
         });
     }
     catch
     {
     }
 }
コード例 #22
0
 /// <summary>
 /// Serializes a message to a byte array to send to remote application.
 ///             This method is synchronized. So, only one thread can call it concurrently.
 /// 
 /// </summary>
 /// <param name="message">Message to be serialized</param><exception cref="T:Tera.NetworkApi.Communication.Scs.Communication.CommunicationException">Throws CommunicationException if message is bigger than maximum allowed message length.</exception>
 public byte[] GetBytes(IScsMessage message)
 {
     byte[] numArray = this.SerializeMessage(message);
     int length = numArray.Length;
     if (length > 134217728)
     {
         throw new CommunicationException("Message is too big (" + (object)length + " bytes). Max allowed length is " + (string)(object)134217728 + " bytes.");
     }
     else
     {
         byte[] buffer = new byte[length + 4];
         BinarySerializationProtocol.WriteInt32(buffer, 0, length);
         Array.Copy((Array)numArray, 0, (Array)buffer, 4, length);
         return buffer;
     }
 }
コード例 #23
0
        /// <summary>
        /// Handles MessageReceived event of _communicationChannel object.
        ///
        /// </summary>
        /// <param name="sender">Source of event</param><param name="e">Event arguments</param>
        private void CommunicationChannel_MessageReceived(object sender, MessageEventArgs e)
        {
            IScsMessage message = e.Message;

            if (message is ScsPingMessage)
            {
                ICommunicationChannel communicationChannel = this._communicationChannel;
                ScsPingMessage        scsPingMessage1      = new ScsPingMessage();
                scsPingMessage1.RepliedMessageId = message.MessageId;
                ScsPingMessage scsPingMessage2 = scsPingMessage1;
                communicationChannel.SendMessage((IScsMessage)scsPingMessage2);
            }
            else
            {
                this.OnMessageReceived(message);
            }
        }
コード例 #24
0
ファイル: ScsServiceClient.cs プロジェクト: qqzhw/hcdz
 /// <summary>
 /// Sends response to the remote application that invoked a service method.
 /// </summary>
 /// <param name="requestMessage">Request message</param>
 /// <param name="returnValue">Return value to send</param>
 /// <param name="exception">Exception to send</param>
 private void SendInvokeResponse(IScsMessage requestMessage, object returnValue, ScsRemoteException exception)
 {
     try
     {
         _requestReplyMessenger.SendMessage(
             new ScsRemoteInvokeReturnMessage
         {
             RepliedMessageId = requestMessage.MessageId,
             ReturnValue      = returnValue,
             RemoteException  = exception
         });
     }
     catch (Exception ex)
     {
         System.Diagnostics.Trace.Write($"SendInvokeResponse: {ex}");
     }
 }
コード例 #25
0
        /// <summary>
        /// Serializes a message to a byte array to send to remote application.
        ///             This method is synchronized. So, only one thread can call it concurrently.
        ///
        /// </summary>
        /// <param name="message">Message to be serialized</param><exception cref="T:Hik.Communication.Scs.Communication.CommunicationException">Throws CommunicationException if message is bigger than maximum allowed message length.</exception>
        public byte[] GetBytes(IScsMessage message)
        {
            byte[] numArray = this.SerializeMessage(message);
            int    length   = numArray.Length;

            if (length > 134217728)
            {
                throw new CommunicationException("Message is too big (" + (object)length + " bytes). Max allowed length is " + (string)(object)134217728 + " bytes.");
            }
            else
            {
                byte[] buffer = new byte[length + 4];
                BinarySerializationProtocol.WriteInt32(buffer, 0, length);
                Array.Copy((Array)numArray, 0, (Array)buffer, 4, length);
                return(buffer);
            }
        }
コード例 #26
0
        /// <summary>
        /// Sends a message and waits a response for that message.
        /// </summary>
        /// <remarks>
        /// Response message is matched with RepliedMessageId property, so if any other message (that
        /// is not reply for sent message) is received from remote application, it is not considered
        /// as a reply and is not returned as return value of this method.
        ///
        /// MessageReceived event is not raised for response messages.
        /// </remarks>
        /// <param name="message">message to send</param>
        /// <param name="timeoutMilliseconds">Timeout duration as milliseconds.</param>
        /// <returns>Response message</returns>
        /// <exception cref="TimeoutException">
        /// Throws TimeoutException if can not receive reply message in timeout value
        /// </exception>
        /// <exception cref="CommunicationException">
        /// Throws CommunicationException if communication fails before reply message.
        /// </exception>
        public IScsMessage SendMessageAndWaitForResponse(IScsMessage message, int timeoutMilliseconds, byte priority)
        {
            // Create a waiting message record and add to list
            WaitingMessage waitingMessage = new WaitingMessage();

            lock (_syncObj)
            {
                _waitingMessages[message.MessageId] = waitingMessage;
            }

            try
            {
                // Send message
                Messenger.SendMessage(message, priority);

                // Wait for response
                waitingMessage.WaitEvent.Wait(timeoutMilliseconds);

                // Check for exceptions
                switch (waitingMessage.State)
                {
                case WaitingMessageStates.WaitingForResponse:
                    Logger.Error(new TimeoutException("Timeout occured. Can not received response."));
                    break;

                case WaitingMessageStates.Cancelled:
                    Logger.Error(new CommunicationException("Disconnected before response received."));
                    break;
                }

                // return response message
                return(waitingMessage.ResponseMessage);
            }
            finally
            {
                // Remove message from waiting messages
                lock (_syncObj)
                {
                    if (_waitingMessages.ContainsKey(message.MessageId))
                    {
                        _waitingMessages.Remove(message.MessageId);
                    }
                }
            }
        }
コード例 #27
0
 /// <summary>
 /// Sends a message to the remote application.
 /// </summary>
 /// <param name="message">Message to be sent</param>
 protected override void SendMessagepublic(IScsMessage message)
 {
     try
     {
         if (_clientSocket.Connected)
         {
             // Create a byte array from message according to current protocol
             var messageBytes = WireProtocol.GetBytes(message);
             // Begin sending the data to the remote device
             _clientSocket.BeginSend(messageBytes, 0, messageBytes.Length, SocketFlags.None,
                                     new AsyncCallback(SendCallback), _clientSocket);
         }
     }
     catch (Exception e)
     {
         // disconnect
     }
 }
コード例 #28
0
ファイル: MyWireProtocol.cs プロジェクト: ChaosCom/scs
        /// <summary>
        /// The sender of a message needs to provide a means to convert a (high-level) object into raw bytes
        /// that will be sent over the network connection.
        /// </summary>
        protected override byte[] SerializeMessage(IScsMessage message)
        {
            if (message is ScsRawDataMessage)
            {
                return (((ScsRawDataMessage)message).MessageData);
            }

            if (message is ScsTextMessage)
            {
                return Encoding.UTF8.GetBytes(((ScsTextMessage)message).Text);
            }

            if (message is ScsPingMessage)
            {
                //if the application idles, occasional ScsPingMessage(s) are being sent out
                //trying to serialize this as ScsTextMessage will throw an exception
            }

            return null;
        }
コード例 #29
0
        /// <summary>
        /// Serializes a message to a byte array to send to remote application.
        /// This method is synchronized. So, only one thread can call it concurrently.
        /// </summary>
        /// <param name="message">Message to be serialized</param>
        /// <exception cref="CommunicationException">Throws CommunicationException if message is bigger than maximum allowed message length.</exception>
        public byte[] GetBytes(IScsMessage message)
        {
            //Serialize the message to a byte array
            var serializedMessage = SerializeMessage(message); 
           
            //Check for message length
            var messageLength = serializedMessage.Length;
            if (messageLength > MaxMessageLength)
            {
                throw new CommunicationException("Message is too big (" + messageLength + " bytes). Max allowed length is " + MaxMessageLength + " bytes.");
            }

            //Create a byte array including the length of the message (4 bytes) and serialized message content
            var bytes = new byte[messageLength + 4];
            WriteInt32(bytes, 0, messageLength);
            Array.Copy(serializedMessage, 0, bytes, 4, messageLength);

            //Return serialized message by this protocol
            return bytes;
        }
コード例 #30
0
ファイル: AsyncExtensions.cs プロジェクト: furesoft/scs
        /// <summary>
        /// Send a Message and Wati for Reply
        /// </summary>
        /// <typeparam name="T">The expected Value</typeparam>
        /// <param name="msg">the message to send</param>
        /// <returns></returns>
        public static Task<IScsMessage> SendMessageWithReplyAsync(this IScsClient client, IScsMessage msg)
        {
            TaskCompletionSource<IScsMessage> tcs = new TaskCompletionSource<IScsMessage>();

            using (var requestReplyMessenger = new RequestReplyMessenger<IScsClient>(client))
            {
                requestReplyMessenger.Start(); //Start request/reply messenger

                //Send user message to the server and get response
                try {
                    var response = requestReplyMessenger.SendMessageAndWaitForResponse(msg);
                    tcs.SetResult(response);
                }
                catch (Exception ex)
                {
                    tcs.SetException(ex);
                }
            }

            return tcs.Task;
        }
コード例 #31
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessageInternal(IScsMessage message)
        {
            //Send message
            var totalSent = 0;

            lock (_syncLock)
            {
                //Create a byte array from message according to current protocol
                var messageBytes = WireProtocol.GetBytes(message);
                //Send all bytes to the remote application
                while (totalSent < messageBytes.Length)
                {
                    try
                    {
                        var sent = _clientSocket.Send(messageBytes, totalSent, messageBytes.Length - totalSent, SocketFlags.None);
                        if (sent <= 0)
                        {
                            throw new CommunicationException("Message could not be sent via TCP socket. Only " + totalSent + " bytes of " + messageBytes.Length + " bytes are sent.");
                        }

                        totalSent += sent;
                    }
                    catch (SocketException ex)
                    {
                        if (ex.SocketErrorCode == SocketError.WouldBlock ||
                            ex.SocketErrorCode == SocketError.IOPending ||
                            ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                        {
                            // socket buffer is probably full, wait and try again
                            Thread.Sleep(30);
                        }
                    }
                }

                LastSentMessageTime = DateTime.Now;

                OnMessageSent(message);
            }
        }
コード例 #32
0
        /// <summary>
        /// Serializes a message to a byte array to send to remote application. This method is
        /// synchronized. So, only one thread can call it concurrently.
        /// </summary>
        /// <param name="message">Message to be serialized</param>
        /// <exception cref="CommunicationException">
        /// Throws CommunicationException if message is bigger than maximum allowed message length.
        /// </exception>
        public byte[] GetBytes(IScsMessage message)
        {
            // Serialize the message to a byte array
            byte[] serializedMessage = SerializeMessage(message);

            // Check for message length
            int messageLength = serializedMessage.Length;

            if (messageLength > MaxMessageLength)
            {
                throw new CommunicationException("Message is too big (" + messageLength + " bytes). Max allowed length is " + MaxMessageLength + " bytes.");
            }

            // Create a byte array including the length of the message (4 bytes) and serialized
            // message content
            byte[] bytes = new byte[messageLength + 4];
            WriteInt32(bytes, 0, messageLength);
            Array.Copy(serializedMessage, 0, bytes, 4, messageLength);

            // Return serialized message by this protocol
            return(bytes);
        }
コード例 #33
0
        protected override byte[] SerializeMessage(IScsMessage message)
        {
            //MemoryStream stream = new MemoryStream();
            //BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);

            //uint nType = ((ScsTextMessage)message).RepliedMessageId;
            //string str = ((ScsTextMessage)message).Text;
            //int length = sizeof(uint) + Encoding.UTF8.GetBytes(str).Length;
            //byte[] retValue = new byte[length];
            //int index = 0;
            //Converter.IntToBytes(nType).CopyTo(retValue, index);
            //index += 4;
            //Encoding.UTF8.GetBytes(str).CopyTo(retValue, index);

            //writer.Write(nType);
            //writer.Write(str);
            //byte[] ret = stream.ToArray();
            //return retValue;
            UMessage msg = ((UMessage)message);

            return(msg.ToBytes());
        }
コード例 #34
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessagepublic(IScsMessage message)
        {
            //Send message
            var totalSent = 0;

            lock (_syncLock)
            {
                //Create a byte array from message according to current protocol
                var messageBytes = WireProtocol.GetBytes(message);
                //Send all bytes to the remote application
                while (totalSent < messageBytes.Length)
                {
                    if (_clientSocket.Connected)
                    {
                        var sent = 0;
                        try
                        {
                            sent = _clientSocket.Send(messageBytes, totalSent, messageBytes.Length - totalSent, SocketFlags.None);
                        }
                        catch (Exception e)
                        {
                            //annoying bug
                            Logger.Log.Error("A packet would have been sent to a disconnected client. IGNORE THIS.", e);
                        }

                        if (sent <= 0)
                        {
                            throw new CommunicationException("Message could not be sent via TCP socket. Only " + totalSent + " bytes of " + messageBytes.Length + " bytes are sent.");
                        }

                        totalSent += sent;
                    }
                }

                LastSentMessageTime = DateTime.Now;
                OnMessageSent(message);
            }
        }
コード例 #35
0
        /// <summary>
        /// Serializes a message to a byte array to send to remote application.
        /// This method is synchronized. So, only one thread can call it concurrently.
        /// </summary>
        /// <param name="message">Message to be serialized</param>
        /// <exception cref="CommunicationException">Throws CommunicationException if message is bigger than maximum allowed message length.</exception>
        public byte[] GetBytes(IScsMessage message)
        {
            byte[] serializedMessage = null;

            //Serialize the message to a byte array
            if (message.GetType().Name == "ScsMessage")
            {
                //Serialize the message to a byte array
                serializedMessage = Encoding.Default.GetBytes(message.ToString());
            }
            else
            {
                serializedMessage = (message as ScsRawDataMessage).MessageData;
            }

            //var serializedMessage = SerializeMessage(message);

            //Check for message length
            var messageLength = serializedMessage.Length;

            if (messageLength > MaxMessageLength)
            {
                throw new CommunicationException("Message is too big (" + messageLength + " bytes). Max allowed length is " + MaxMessageLength + " bytes.");
            }

            //Create a byte array including the length of the message (4 bytes) and serialized message content
            // var bytes = new byte[messageLength + 4];
            // WriteInt32(bytes, 0, messageLength);
            // Array.Copy(serializedMessage, 0, bytes, 4, messageLength);

            var bytes = new byte[messageLength + 4];

            WriteInt32(bytes, 0, messageLength);
            Array.Copy(serializedMessage, 0, bytes, 4, messageLength);

            //Return serialized message by this protocol
            return(bytes);
        }
コード例 #36
0
        /// <summary>
        /// Sends a message to the remote application.
        ///
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessageInternal(IScsMessage message)
        {
            int offset = 0;

            lock (this._syncLock)
            {
                byte[] local_1 = this.WireProtocol.GetBytes(message);
                while (offset < local_1.Length)
                {
                    int local_2 = this._clientSocket.Send(local_1, offset, local_1.Length - offset, SocketFlags.None);
                    if (local_2 <= 0)
                    {
                        throw new CommunicationException("Message could not be sent via TCP socket. Only " + (object)offset + " bytes of " + (string)(object)local_1.Length + " bytes are sent.");
                    }
                    else
                    {
                        offset += local_2;
                    }
                }
                this.LastSentMessageTime = DateTime.Now;
                this.OnMessageSent(message);
            }
        }
コード例 #37
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessageInternal(IScsMessage message)
        {
            //Send message
            var totalSent = 0;
            //lock (_syncLock)
            //{
                //Create a byte array from message according to current protocol
                var messageBytes = WireProtocol.GetBytes(message);
                //Send all bytes to the remote application
                while (totalSent < messageBytes.Length)
                {
                    var sent = _clientSocket.Send(messageBytes, totalSent, messageBytes.Length - totalSent, SocketFlags.None);
                    if (sent <= 0)
                    {
                        throw new CommunicationException("Message could not be sent via TCP socket. Only " + totalSent + " bytes of " + messageBytes.Length + " bytes are sent.");
                    }

                    totalSent += sent;
                }

                LastSentMessageTime = DateTime.Now;
                OnMessageSent(message);
            //}
        }
コード例 #38
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessageInternal(IScsMessage message)
        {
            //Send message
            var totalSent = 0;

            lock (_syncLock)
            {
                //Create a byte array from message according to current protocol
                var messageBytes = WireProtocol.GetBytes(message);
                //Send all bytes to the remote application

                try
                {
                    _sslStream.Write(messageBytes, totalSent, messageBytes.Length);
                }
                catch
                {
                    throw new CommunicationException("Message could not be sent via SSL stream");
                }

                LastSentMessageTime = DateTime.Now;
                OnMessageSent(message);
            }
        }
コード例 #39
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        /// <exception cref="ArgumentNullException">Throws ArgumentNullException if message is null</exception>
        public void SendMessage(IScsMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            SendMessageInternal(message);
        }
コード例 #40
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessageInternal(IScsMessage message)
        {
            //Send message
            var totalSent = 0;
            lock (_syncLock)
            {
                //Create a byte array from message according to current protocol
                var messageBytes = WireProtocol.GetBytes(message);
                //Send all bytes to the remote application
                while (totalSent < messageBytes.Length)
                {
                    var sent = _clientSocket.Send(messageBytes, totalSent, messageBytes.Length - totalSent, SocketFlags.None);
                    if (sent <= 0)
                    {
                        throw new CommunicationException("Message could not be sent via TCP socket. Only " + totalSent + " bytes of " + messageBytes.Length + " bytes are sent.");
                    }

                    totalSent += sent;
                }

                LastSentMessageTime = DateTime.Now;
                OnMessageSent(message);
            }
        }
コード例 #41
0
 /// <summary>
 /// Sends a message to the remote application.
 /// 
 /// </summary>
 /// <param name="message">Message to be sent</param>
 protected override void SendMessageInternal(IScsMessage message)
 {
     int offset = 0;
     lock (this._syncLock)
     {
         byte[] local_1 = this.WireProtocol.GetBytes(message);
         while (offset < local_1.Length)
         {
             int local_2 = this._clientSocket.Send(local_1, offset, local_1.Length - offset, SocketFlags.None);
             if (local_2 <= 0)
                 throw new CommunicationException("Message could not be sent via TCP socket. Only " + (object)offset + " bytes of " + (string)(object)local_1.Length + " bytes are sent.");
             else
                 offset += local_2;
         }
         this.LastSentMessageTime = DateTime.Now;
         this.OnMessageSent(message);
     }
 }
コード例 #42
0
ファイル: ScsServerClient.cs プロジェクト: Koushi009/Temu
 /// <summary>
 /// Raises MessageSent event.
 /// 
 /// </summary>
 /// <param name="message">Received message</param>
 protected virtual void OnMessageSent(IScsMessage message)
 {
     EventHandler<MessageEventArgs> eventHandler = this.MessageSent;
     if (eventHandler == null)
         return;
     eventHandler((object)this, new MessageEventArgs(message));
 }
コード例 #43
0
ファイル: ScsServerClient.cs プロジェクト: Koushi009/Temu
 /// <summary>
 /// Raises MessageReceived event.
 /// 
 /// </summary>
 /// <param name="message">Received message</param>
 private void OnMessageReceived(IScsMessage message)
 {
     EventHandler<MessageEventArgs> eventHandler = this.MessageReceived;
     if (eventHandler == null)
         return;
     eventHandler((object)this, new MessageEventArgs(message));
 }
コード例 #44
0
 /// <summary>
 /// Raises MessageReceived event.
 /// </summary>
 /// <param name="message">Received message</param>
 private void OnMessageReceived(IScsMessage message)
 {
     var handler = MessageReceived;
     if (handler != null)
     {
         handler(this, new MessageEventArgs(message));
     }
 }
コード例 #45
0
 /// <summary>
 /// Sends a message to the remote application.
 /// </summary>
 /// <param name="message">Message to be sent</param>
 protected override void SendMessagepublic(IScsMessage message, byte priority)
 {
     if (priority > 5)
     {
         _highPriorityBuffer.Enqueue(WireProtocol.GetBytes(message));
     }
     else
     {
         _lowPriorityBuffer.Enqueue(WireProtocol.GetBytes(message));
     }
 }
コード例 #46
0
 protected override byte[] SerializeMessage(IScsMessage message)
 {
     return Encoding.UTF8.GetBytes(((ScsTextMessage)message).Text);
 }
コード例 #47
0
ファイル: ScsClientBase.cs プロジェクト: aerzy/OpenNos
        /// <summary>
        /// Sends a message to the server.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        /// <exception cref="CommunicationStateException">Throws a CommunicationStateException if client is not connected to the server.</exception>
        public void SendMessage(IScsMessage message)
        {
            if (CommunicationState != CommunicationStates.Connected)
            {
                throw new CommunicationStateException("Client is not connected to the server.");
            }

            _communicationChannel.SendMessage(message);
        }
コード例 #48
0
ファイル: OuterWireProtocol.cs プロジェクト: mMellowz/revcore
 public byte[] GetBytes(IScsMessage message)
 {
     return ((OuterNetworkMessage)message).Data;
 }
コード例 #49
0
 public byte[] GetBytes(IScsMessage message)
 {
     return ((SendPacket) message).Data;
 }
コード例 #50
0
ファイル: MessageEventArgs.cs プロジェクト: OpenNos/OpenNos
 /// <summary>
 /// Creates a new MessageEventArgs object.
 /// </summary>
 /// <param name="message">Message object that is associated with this event</param>
 public MessageEventArgs(IScsMessage message, DateTime receivedTimestamp)
 {
     Message = message;
     ReceivedTimestamp = receivedTimestamp;
 }
コード例 #51
0
ファイル: MessageEventArgs.cs プロジェクト: aerzy/OpenNos
 /// <summary>
 /// Creates a new MessageEventArgs object.
 /// </summary>
 /// <param name="message">Message object that is associated with this event</param>
 public MessageEventArgs(IScsMessage message)
 {
     Message = message;
 }
コード例 #52
0
ファイル: EzUdpPeer.cs プロジェクト: HowieXue/Hospital_projs
        protected virtual void OnMessageReceived(IPEndPoint remote, IScsMessage msg)
        {
            EzLogger.GlobalLogger.debug(string.Format("udp message from {0}: {1}", remote, msg));

            if (MessageReceived != null)
            {
                MessageReceived(remote, new MessageEventArgs(msg));
            }
        }
コード例 #53
0
 /// <summary>
 /// Sends a message to the remote application.
 /// This method is overrided by derived classes to really send to message.
 /// </summary>
 /// <param name="message">Message to be sent</param>
 protected abstract void SendMessageInternal(IScsMessage message);
コード例 #54
0
 /// <summary>
 /// This method is used to serialize a IScsMessage to a byte array.
 /// This method can be overrided by derived Classs to change serialization strategy.
 /// It is a couple with DeserializeMessage method and must be overrided together.
 /// </summary>
 /// <param name="message">Message to be serialized</param>
 /// <returns>
 /// Serialized message bytes.
 /// Does not include length of the message.
 /// </returns>
 protected virtual byte[] SerializeMessage(IScsMessage message)
 {
     using (var memoryStream = new MemoryStream())
     {
         new BinaryFormatter().Serialize(memoryStream, message);
         return memoryStream.ToArray();
     }
 }
コード例 #55
0
 /// <summary>
 /// Raises MessageSent event.
 /// </summary>
 /// <param name="message">Received message</param>
 protected virtual void OnMessageSent(IScsMessage message)
 {
     var handler = MessageSent;
     if (handler != null)
     {
         handler(this, new MessageEventArgs(message));
     }
 }
コード例 #56
0
ファイル: ScsServerClient.cs プロジェクト: Koushi009/Temu
 /// <summary>
 /// Sends a message to the client.
 /// 
 /// </summary>
 /// <param name="message">Message to be sent</param>
 public void SendMessage(IScsMessage message)
 {
     this._communicationChannel.SendMessage(message);
 }
コード例 #57
0
 public byte[] GetBytes(IScsMessage message)
 {
     Session.Encrypt(ref ((GameMessage) message).Data);
     return ((GameMessage) message).Data;
 }
コード例 #58
0
ファイル: KeyProtocol.cs プロジェクト: arkanoid1/Temu
 public byte[] GetBytes(IScsMessage message)
 {
     return ((KeyMessage)message).Key;
 }
コード例 #59
0
 public void Send(IScsMessage msg)
 {
     _client.SendMessage(msg);
 }
コード例 #60
0
        /// <summary>
        /// Sends a message to the remote application.
        /// </summary>
        /// <param name="message">Message to be sent</param>
        protected override void SendMessageInternal(IScsMessage message)
        {
            //Send message
            var totalSent = 0;
            lock (_syncLock)
            {
                //Create a byte array from message according to current protocol
                var messageBytes = WireProtocol.GetBytes(message);
                //Send all bytes to the remote application
                while (totalSent < messageBytes.Length)
                {
                    try
                    {
                        var sent = _clientSocket.Send(messageBytes, totalSent, messageBytes.Length - totalSent, SocketFlags.None);
                        if (sent <= 0)
                        {
                            throw new CommunicationException("Message could not be sent via TCP socket. Only " + totalSent + " bytes of " + messageBytes.Length + " bytes are sent.");
                        }

                        totalSent += sent;
                    }
                    catch (SocketException ex)
                    {
                        if (ex.SocketErrorCode == SocketError.WouldBlock ||
                            ex.SocketErrorCode == SocketError.IOPending ||
                            ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                        {
                            // socket buffer is probably full, wait and try again
                            Thread.Sleep(30);
                        }
                    }
                }

                LastSentMessageTime = DateTime.Now;

                OnMessageSent(message);
            }
        }