示例#1
0
        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);
            }
        }
示例#2
0
        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();
                    }
                }
            }
        }