public bool Combine(byte[] buffer, int ofs, int len, Func <MemoryStream, bool> callback) { Socket socket = this.SocketObject; if (socket == null) { return(false); } using (MemoryStream ms = new MemoryStream()) { byte[] header = new byte[sizeof(MalockPacketHeader)]; fixed(byte *pinned = header) { MalockPacketHeader *packet = (MalockPacketHeader *)pinned; packet->header_key = FKEY; packet->payload_len = len; } ms.Write(header, 0, header.Length); ms.Write(buffer, ofs, len); callback(ms); return(true); } }
private void ProcessReceive(IAsyncResult ar) { Socket socket = null; lock (this.syncobj) { socket = this.SocketObject; } if (socket != null) { if (ar == null) { int surplus = this.rlen - this.rofs; if (surplus <= 0) { this.error(); } else { if (surplus > this.rbuf.Length) { surplus = this.rbuf.Length; } try { int ofs = this.rofs; if (this.rstream != null) { ofs = 0; } if (!socket.Connected) { this.error(); return; } socket.BeginReceive(this.rbuf, ofs, surplus, SocketFlags.None, this.receivecallback, null); } catch (Exception) { this.error(); } } } else { try { SocketError error = SocketError.SocketError; if (!socket.Connected) { this.error(); return; } int len = socket.EndReceive(ar, out error); if (len <= 0) { this.error(); } else { do { bool alreadyrecv = false; if (this.rstream != null) { this.rstream.Write(this.rbuf, 0, len); } this.rofs += len; if (this.rofs == this.rlen) { if (this.rstream == null) { fixed(byte *pinned = this.rbuf) { MalockPacketHeader *packet = (MalockPacketHeader *)pinned; if (packet->header_key != FKEY) { this.error(); break; } this.rofs = 0; this.rlen = packet->payload_len; this.rstream = new MemoryStream(packet->payload_len); if (packet->payload_len <= 0) { alreadyrecv = true; } } } else { alreadyrecv = true; } } if (alreadyrecv) { MemoryStream ms = this.rstream; this.rstream = null; this.rofs = 0; this.rlen = sizeof(MalockPacketHeader); if (ms.Length > 0) { if (ms.Position != 0) { ms.Position = 0; } ms.Seek(0, SeekOrigin.Begin); } this.receive(ms); } this.receivecallback(null); } while (false); } } catch (Exception) { this.error(); } } } }