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