private void TryDequeueAndPostSend(ExSocket socket, SocketAsyncEventArgs ioEventArgs) { bool isOwner = ioEventArgs == null; byte[] data; if (socket.TryDequeue(out data)) { if (ioEventArgs == null) { ioEventArgs = ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = socket.WorkSocket; } DataToken dataToken = (DataToken)ioEventArgs.UserToken; dataToken.Socket = socket; dataToken.byteArrayForMessage = data; dataToken.messageLength = data.Length; try { PostSend(ioEventArgs); } catch { if (isOwner) { ReleaseIOEventArgs(ioEventArgs); } throw; } } else { ReleaseIOEventArgs(ioEventArgs); socket.ResetSendFlag(); } }
private void AddClient(ExSocket socket) { lock (clientSockets) { clientSockets.Add(socket); } }
public void CloseSocket(ExSocket socket) { try { socket.WorkSocket.Shutdown(SocketShutdown.Both); } catch { } socket.WorkSocket.Close(); }
public void PostSend(ExSocket socket, byte[] data, int offset, int count) { byte[] buffer = new byte[count + 4]; Buffer.BlockCopy(BitConverter.GetBytes(count), 0, buffer, 0, 4); Buffer.BlockCopy(data, offset, buffer, 4, count); socket.Enqueue(buffer); if (socket.TrySetSendFlag()) { try { TryDequeueAndPostSend(socket, null); } catch { socket.ResetSendFlag(); throw; } } }
private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { PostAccept(); if (acceptEventArgs.SocketError != SocketError.Success) { HandleBadAccept(acceptEventArgs); return; } SocketAsyncEventArgs ioEventArgs = this.ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = acceptEventArgs.AcceptSocket; acceptEventArgs.AcceptSocket = null; this.acceptEventArgsPool.Push(acceptEventArgs); var dataToken = (DataToken)ioEventArgs.UserToken; ioEventArgs.SetBuffer(dataToken.bufferOffset, socketSettings.BufferSize); var exSocket = new ExSocket(ioEventArgs.AcceptSocket); exSocket.LastAccessTime = DateTime.Now; dataToken.Socket = exSocket; AddClient(exSocket); try { OnConnected(new ConnectionEventArgs { Socket = exSocket }); } catch (Exception ex) { logger.Error("OnConnected", ex); } PostReceive(ioEventArgs); }
private void TryDequeueAndPostSend(ExSocket socket, SocketAsyncEventArgs ioEventArgs) { bool isOwner = ioEventArgs == null; byte[] data; if (socket.TryDequeue(out data)) { if (ioEventArgs == null) { ioEventArgs = ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = socket.WorkSocket; } DataToken dataToken = (DataToken)ioEventArgs.UserToken; dataToken.Socket = socket; dataToken.byteArrayForMessage = data; dataToken.messageLength = data.Length; try { PostSend(ioEventArgs); } catch { if (isOwner) ReleaseIOEventArgs(ioEventArgs); throw; } } else { ReleaseIOEventArgs(ioEventArgs); socket.ResetSendFlag(); } }
private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { PostAccept(); if (acceptEventArgs.SocketError != SocketError.Success) { HandleBadAccept(acceptEventArgs); return; } SocketAsyncEventArgs ioEventArgs = this.ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = acceptEventArgs.AcceptSocket; acceptEventArgs.AcceptSocket = null; this.acceptEventArgsPool.Push(acceptEventArgs); var dataToken = (DataToken)ioEventArgs.UserToken; ioEventArgs.SetBuffer(dataToken.bufferOffset, socketSettings.BufferSize); var exSocket = new ExSocket(ioEventArgs.AcceptSocket); exSocket.LastAccessTime = DateTime.Now; dataToken.Socket = exSocket; AddClient(exSocket); try { OnConnected(new ConnectionEventArgs { Socket = exSocket }); } catch (Exception ex) { logger.Error("OnConnected", ex); } PostReceive(ioEventArgs); }
private void AddClient(ExSocket socket) { lock (clientSockets) { clientSockets.Add(socket); } }
public void PostSend(ExSocket socket, byte[] data, int offset, int count) { byte[] buffer = new byte[count + 4]; Buffer.BlockCopy(BitConverter.GetBytes(count), 0, buffer, 0, 4); Buffer.BlockCopy(data, offset, buffer, 4, count); socket.Enqueue(buffer); if (socket.TrySetSendFlag()) { try { TryDequeueAndPostSend(socket, null); } catch { socket.ResetSendFlag(); throw; } } }
public void CloseSocket(ExSocket socket) { try { socket.WorkSocket.Shutdown(SocketShutdown.Both); } catch { } socket.WorkSocket.Close(); }