/// <summary> /// 尝试发送数据 /// </summary> /// <param name="socket"></param> /// <param name="ioEventArgs"></param> private void DequeueAndPostSend(GSSocket socket, SocketAsyncEventArgs ioEventArgs) { try { byte[] data; if (socket.Dequeue(out data)) //获取发送队列中的数据 { if (ioEventArgs == null) { ioEventArgs = ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = socket.WorkSocket; } DataToken dataToken = (DataToken)ioEventArgs.UserToken; dataToken.Socket = socket; dataToken.data = data; dataToken.dataBytesDone = 0; //投递发送 PostSend(ioEventArgs); } else { //发送结束 ReleaseIOEventArgs(ioEventArgs); socket.ResetSendFlag(); } } catch (Exception ex) { socket.ResetSendFlag(); Console.WriteLine(ex.ToString()); } }
/// <summary> /// 处理接收 /// </summary> /// <param name="ioEventArgs"></param> private void ProcessReceive(SocketAsyncEventArgs ioEventArgs) { DataToken dataToken = (DataToken)ioEventArgs.UserToken; if (ioEventArgs.BytesTransferred == 0) { //客户端主动关闭连接 Closing(ioEventArgs); return; } if (ioEventArgs.SocketError != SocketError.Success) { //Socket错误 Closing(ioEventArgs); return; } GSSocket gsSocket = dataToken == null ? null : dataToken.Socket; byte[] buffer = new byte[ioEventArgs.BytesTransferred]; Buffer.BlockCopy(ioEventArgs.Buffer, dataToken.bufferOffset, buffer, 0, buffer.Length); PostReceive(ioEventArgs); }
/// <summary> /// 处理Accept /// </summary> /// <param name="acceptEventArgs"></param> private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { try { maxConnectionsEnforcer.WaitOne(); if (acceptEventArgs.SocketError != SocketError.Success) { HandleBadAccept(acceptEventArgs); } else { //投递接收事件 SocketAsyncEventArgs ioEventArgs = ioEventArgsPool.Pop(); ioEventArgs.AcceptSocket = acceptEventArgs.AcceptSocket; DataToken dataToken = (DataToken)ioEventArgs.UserToken; ioEventArgs.SetBuffer(dataToken.bufferOffset, socketSettings.BufferSize); GSSocket gsSocket = new GSSocket(ioEventArgs.AcceptSocket); dataToken.Socket = gsSocket; acceptEventArgs.AcceptSocket = null; PostReceive(ioEventArgs); //释放acceptArgs ReleaseAccept(acceptEventArgs, false); } } finally { //投递下一个Accept事件 PostAccept(); } }
/// <summary> /// 异步发送 /// </summary> /// <param name="socket"></param> /// <param name="data"></param> /// <returns></returns> public async Task <bool> SendAsync(GSSocket socket, byte[] data) { socket.Enqueue(data); return(await Task.Run(() => { if (socket.TrySetSendFlag()) { DequeueAndPostSend(socket, null); return true; } return false; })); }
/// <summary> /// 异步发送 /// </summary> /// <param name="socket"></param> /// <param name="data"></param> /// <returns></returns> public async Task<bool> SendAsync(GSSocket socket, byte[] data) { socket.Enqueue(data); return await Task.Run(() => { if (socket.TrySetSendFlag()) { DequeueAndPostSend(socket, null); return true; } return false; }); }