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