/// <summary> /// Initializes a SocketStream with a SaeaSocketWrapper object. /// </summary> /// <param name="socket">a SaeaSocketWrapper object</param> public SocketStream(SaeaSocketWrapper socket) { if (socket == null) { throw new ArgumentNullException("socket"); } streamSocket = socket; bufPool = ByteBufPool.Default; }
/// <summary> /// Accepts a incoming connection request. /// </summary> /// <returns>A ISocket instance used to send and receive data</returns> public ISocketWrapper Accept() { var socket = innerSocket.Accept(); var clientSock = new SaeaSocketWrapper(this, socket); logger.LogDebug("Accepted connection from {0} to {1}", clientSock.RemoteEndPoint, clientSock.LocalEndPoint); DoReceive(clientSock); return(clientSock); }
/// <summary> /// Post a receive operation /// </summary> private void DoReceive(SaeaSocketWrapper clientSocket) { // Prepares the SocketAsyncEventArgs for receive operation. SocketAsyncEventArgs recvEventArg; if (!poolOfRecvSendEvents.TryDequeue(out recvEventArg)) { recvEventArg = new SocketAsyncEventArgs(); recvEventArg.Completed += IoCompleted; } // Allocate buffer for the receive operation. var dataBuf = ByteBufPool.Default.Allocate(); recvEventArg.UserToken = new SockDataToken(clientSocket, dataBuf); recvEventArg.SetBuffer(dataBuf.Array, dataBuf.WriterIndexOffset, dataBuf.WritableBytes); // Post async receive operation on the socket var socket = clientSocket.innerSocket; recvEventArg.AcceptSocket = socket; if (clientSocket.isCleanedUp || socket == null) { // do nothing if client socket already disposed. dataBuf.Status = (int)SocketError.NetworkDown; dataBuf.Release(); recvEventArg.UserToken = null; clientSocket.receivedDataQueue.Add(dataBuf); return; } var willRaiseEvent = socket.ReceiveAsync(recvEventArg); if (!willRaiseEvent) { // The operation completed synchronously, we need to call ProcessReceive method directly ProcessReceive(recvEventArg); } }
/// <summary> /// Initializes a SaeaSocketWrapper instance for an accepted socket. /// </summary> private SaeaSocketWrapper(SaeaSocketWrapper parent, Socket acceptedSocket) { this.parent = parent; innerSocket = acceptedSocket; isConnected = true; }
/// <summary> /// Post a receive operation /// </summary> private void DoReceive(SaeaSocketWrapper clientSocket) { // Prepares the SocketAsyncEventArgs for receive operation. SocketAsyncEventArgs recvEventArg; if (!poolOfRecvSendEvents.TryDequeue(out recvEventArg)) { recvEventArg = new SocketAsyncEventArgs(); recvEventArg.Completed += IoCompleted; } // Allocate buffer for the receive operation. var dataBuf = ByteBufPool.Default.Allocate(); recvEventArg.UserToken = new SockDataToken(clientSocket, dataBuf); recvEventArg.SetBuffer(dataBuf.Array, dataBuf.WriterIndexOffset, dataBuf.WritableBytes); // Post async receive operation on the socket var socket = clientSocket.innerSocket; recvEventArg.AcceptSocket = socket; if (clientSocket.isCleanedUp || socket == null) { // do nothing if client socket already disposed. dataBuf.Status = (int) SocketError.NetworkDown; dataBuf.Release(); recvEventArg.UserToken = null; clientSocket.receivedDataQueue.Add(dataBuf); return; } var willRaiseEvent = socket.ReceiveAsync(recvEventArg); if (!willRaiseEvent) { // The operation completed synchronously, we need to call ProcessReceive method directly ProcessReceive(recvEventArg); } }
/// <summary> /// Accepts a incoming connection request. /// </summary> /// <returns>A ISocket instance used to send and receive data</returns> public ISocketWrapper Accept() { var socket = innerSocket.Accept(); var clientSock = new SaeaSocketWrapper(this, socket); logger.LogDebug("Accepted connection from {0} to {1}", clientSock.RemoteEndPoint, clientSock.LocalEndPoint); DoReceive(clientSock); return clientSock; }