コード例 #1
0
        internal void Deliver(EndPoint remoteEP, object obj)
        {
            if (!IsActive)
                return;

            if (obj is RequestWrapper) {
                RequestWrapper req = (RequestWrapper)obj;
                InquiredEventArgs args = new InquiredResponseState (req.Message, remoteEP, req.ID);
                InvokeInquired (this, args);
            } else if (obj is ResponseWrapper) {
                ResponseWrapper res = (ResponseWrapper)obj;
                InquiredAsyncResultBase ar = RemoveFromRetryList (res.ID, remoteEP);
                if (ar == null)
                    return;
                ar.Complete (res.Message, this);
                InvokeInquirySuccess (this, new InquiredEventArgs (ar.Request, res.Message, remoteEP, DateTime.Now - ar.TransmitTime, ar.RetryCount));
            } else if (obj is OneWayMessage) {
                InvokeReceived (this, new ReceivedEventArgs ((obj as OneWayMessage).Message, remoteEP));
            }
        }
コード例 #2
0
ファイル: MessagingSocket.cs プロジェクト: kazuki/p2pncs
        void Socket_Received(object sender, DatagramReceiveEventArgs e)
        {
            if (!IsActive)
                return;

            MessageType type;
            object obj;
            int tmp;
            uint id = 0;
            try {
                byte[] msg = _key.Decrypt (e.Buffer, 0, e.Size);
                using (MemoryStream strm = new MemoryStream (msg, 0, msg.Length, false)) {
                    if ((tmp = strm.ReadByte ()) < 0)
                        goto MessageError;
                    type = (MessageType)tmp;
                    if (type != MessageType.OneWay) {
                        for (int i = 0; i < 32; i += 8) {
                            if ((tmp = strm.ReadByte ()) < 0)
                                goto MessageError;
                            id |= (uint)(tmp << i);
                        }
                    }
                    obj = _formatter.Deserialize (strm);
                    if (obj == null)
                        goto MessageError;
                }
            } catch {
                goto MessageError;
            }

            if (_nullObject.Equals (obj))
                obj = null;
            string strMsgType = (obj == null ? "null msg" : obj.GetType ().Name);

            switch (type) {
                case MessageType.Request:
                    ThreadTracer.AppendThreadName (" (req: " + strMsgType + ")");
                    InquiredEventArgs args = new InquiredResponseState (obj, e.RemoteEndPoint, id);
                    InvokeInquired (this, args);
                    break;
                case MessageType.Response:
                    InquiredAsyncResultBase ar = RemoveFromRetryList (id, e.RemoteEndPoint);
                    if (ar == null)
                        return;
                    ThreadTracer.AppendThreadName (" (res: " + strMsgType + ", req: "
                        + (ar.Request == null ? "null msg" : ar.Request.GetType ().Name) + ")");
                    ar.Complete (obj, this);
                    InvokeInquirySuccess (this, new InquiredEventArgs (ar.Request, obj, e.RemoteEndPoint, DateTime.Now - ar.TransmitTime, ar.RetryCount));
                    break;
                case MessageType.OneWay:
                    ThreadTracer.AppendThreadName (" (ow: " + strMsgType + ")");
                    InvokeReceived (this, new ReceivedEventArgs (obj, e.RemoteEndPoint));
                    break;
                default:
                    goto MessageError;
            }
            return;

            MessageError:
            return;
        }