private IAsyncResult AsyncSend(TcpConnEntry entry, MemoryStream data, AsyncCallback callback)
        {
            int n   = (int)data.Length;
            int len = n > 1020 ? 2048 : n > 508 ? 1024 : 512;

            byte[] buf = new byte[len];
            buf[0] = (byte)((n >> 24) & 0xff);
            buf[1] = (byte)((n >> 16) & 0xff);
            buf[2] = (byte)((n >> 8) & 0xff);
            buf[3] = (byte)(n & 0xff);
            int p = len - 4;
            SendAndReceiveContext context = new SendAndReceiveContext();

            context.callback = callback;
            context.entry    = entry;
            NetworkStream stream = entry.conn.stream;

            if (n <= p)
            {
                data.Read(buf, 4, n);
                return(stream.BeginWrite(buf, 0, n + 4, new AsyncCallback(WriteFullCallback), context));
            }
            else
            {
                data.Read(buf, 4, p);
                context.buf    = data.ToArray();
                context.offset = p;
                context.length = n - p;
                return(stream.BeginWrite(buf, 0, len, new AsyncCallback(WritePartCallback), context));
            }
        }
        protected override IAsyncResult BeginSendAndReceive(MemoryStream data, AsyncCallback callback)
        {
            TcpConnEntry entry = pool.Get(uri);

            try {
                if (entry.conn.client == null)
                {
                    entry.Set(CreateClient(uri));
                }
                return(AsyncSend(entry, data, callback));
            }
            catch {
                entry.Close();
                pool.Free(entry);
                throw;
            }
        }
 public void Free(TcpConnEntry entry)
 {
     if (entry.status == TcpConnStatus.Closing)
     {
         if (entry.conn.client != null)
         {
             CloseConn(entry.conn);
             entry.conn.stream = null;
             entry.conn.client = null;
         }
         entry.uri = null;
     }
     lock (syncRoot) {
         entry.lastUsedTime = DateTime.Now.Ticks;
         entry.status       = TcpConnStatus.Free;
     }
 }
        protected override MemoryStream SendAndReceive(MemoryStream data)
        {
            TcpConnEntry entry = pool.Get(uri);

            try {
                if (entry.conn.client == null)
                {
                    entry.Set(CreateClient(uri));
                }
                Stream stream = entry.conn.stream;
                Send(stream, data);
                data = Receive(stream);
            }
            catch {
                entry.Close();
                throw;
            }
            finally {
                pool.Free(entry);
            }
            return(data);
        }
 public TcpConnEntry Get(string uri)
 {
     lock (syncRoot) {
         foreach (TcpConnEntry entry in pool)
         {
             if (entry.status == TcpConnStatus.Free)
             {
                 if (entry.uri == uri)
                 {
                     if (entry.conn.stream != null)
                     {
                         try {
                             if (entry.conn.stream.DataAvailable)
                             {
                             }
                         }
                         catch {
                             CloseConn(entry.conn);
                             entry.conn.stream = null;
                             entry.conn.client = null;
                         }
                     }
                     entry.status = TcpConnStatus.Using;
                     return(entry);
                 }
                 else if (entry.uri == null)
                 {
                     entry.status = TcpConnStatus.Using;
                     entry.uri    = uri;
                     return(entry);
                 }
             }
         }
         TcpConnEntry newEntry = new TcpConnEntry(uri);
         pool.Add(newEntry);
         return(newEntry);
     }
 }