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 TryDequeueAndPostSend(ExSocket socket, SocketAsyncEventArgs ioEventArgs) { bool isOwner = ioEventArgs == null; SocketAsyncResult result; if (socket.TryDequeue(out result)) { if (ioEventArgs == null) { ioEventArgs = ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = socket.WorkSocket; } DataToken dataToken = (DataToken)ioEventArgs.UserToken; dataToken.Socket = socket; dataToken.AsyncResult = result; dataToken.byteArrayForMessage = result.Data; dataToken.messageLength = result.Data.Length; try { PostSend(ioEventArgs); } catch (Exception ex) { dataToken.ResultCallback(ResultCode.Error, ex); if (isOwner) { ReleaseIOEventArgs(ioEventArgs); } socket.ResetSendFlag(); } } else { ReleaseIOEventArgs(ioEventArgs); socket.ResetSendFlag(); } }
/// <summary> /// /// </summary> /// <param name="socket"></param> /// <param name="buffer"></param> /// <param name="callback"></param> internal protected override async Task <bool> SendAsync(ExSocket socket, byte[] buffer, Action <SocketAsyncResult> callback) { //socket.Enqueue(buffer, callback); if (socket.DirectSendOrEnqueue(buffer, callback)) { try { TryDequeueAndPostSend(socket, null); return(true); } catch (Exception ex) { socket.ResetSendFlag(); TraceLog.WriteError("SendAsync {0} error:{1}", socket.RemoteEndPoint, ex); } } return(false); }
/// <summary> /// /// </summary> /// <param name="socket"></param> /// <param name="buffer"></param> internal protected override bool SendAsync(ExSocket socket, byte[] buffer) { socket.Enqueue(buffer); if (socket.TrySetSendFlag()) { try { TryDequeueAndPostSend(socket, null); return(true); } catch (Exception ex) { socket.ResetSendFlag(); TraceLog.WriteError("SendAsync {0} error:{1}", socket.RemoteEndPoint, ex); } } return(false); }
/// <summary> /// Posts the send. /// </summary> /// <param name="socket">Socket.</param> /// <param name="data">Data.</param> /// <param name="offset">Offset.</param> /// <param name="count">Count.</param> 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 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(); } }
/// <summary> /// /// </summary> /// <param name="socket"></param> /// <param name="buffer"></param> /// <param name="callback"></param> internal protected override async Task<bool> SendAsync(ExSocket socket, byte[] buffer, Action<SocketAsyncResult> callback) { socket.Enqueue(buffer, callback); return await Task.Run(() => { if (socket.TrySetSendFlag()) { try { TryDequeueAndPostSend(socket, null); return true; } catch (Exception ex) { socket.ResetSendFlag(); TraceLog.WriteError("SendAsync {0} error:{1}", socket.RemoteEndPoint, ex); } } return false; }); }
private void TryDequeueAndPostSend(ExSocket socket, SocketAsyncEventArgs ioEventArgs) { bool isOwner = ioEventArgs == null; SocketAsyncResult result; if (socket.TryDequeue(out result)) { if (ioEventArgs == null) { ioEventArgs = ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = socket.WorkSocket; } DataToken dataToken = (DataToken)ioEventArgs.UserToken; dataToken.Socket = socket; dataToken.AsyncResult = result; dataToken.byteArrayForMessage = result.Data; dataToken.messageLength = result.Data.Length; try { PostSend(ioEventArgs); } catch (Exception ex) { dataToken.ResultCallback(ResultCode.Error, ex); if (isOwner) ReleaseIOEventArgs(ioEventArgs); socket.ResetSendFlag(); } } else { ReleaseIOEventArgs(ioEventArgs); socket.ResetSendFlag(); } }