public int HandleMessage(SocketAsyncEventArgs saea, DataToken dataToken, int remainingBytesToProcess) { if (dataToken.messageBytesDone == 0) { dataToken.byteArrayForMessage = new byte[dataToken.messageLength]; } var nonCopiedBytes = 0; if (remainingBytesToProcess + dataToken.messageBytesDone >= dataToken.messageLength) { var copyedBytes = dataToken.RemainByte; nonCopiedBytes = remainingBytesToProcess - copyedBytes; Buffer.BlockCopy(saea.Buffer, dataToken.DataOffset, dataToken.byteArrayForMessage, dataToken.messageBytesDone, copyedBytes); dataToken.messageBytesDone = dataToken.messageLength; dataToken.bufferSkip += copyedBytes; } else { Buffer.BlockCopy(saea.Buffer, dataToken.DataOffset, dataToken.byteArrayForMessage, dataToken.messageBytesDone, remainingBytesToProcess); dataToken.messageBytesDone += remainingBytesToProcess; } return(nonCopiedBytes); }
public int HandlePrefix(SocketAsyncEventArgs saea, DataToken dataToken, int remainingBytesToProcess) { if (remainingBytesToProcess >= 4 - dataToken.prefixBytesDone) { for (int i = 0; i < 4 - dataToken.prefixBytesDone; i++) { dataToken.byteArrayForPrefix[dataToken.prefixBytesDone + i] = saea.Buffer[dataToken.DataOffset + i]; } remainingBytesToProcess = remainingBytesToProcess - 4 + dataToken.prefixBytesDone; dataToken.bufferSkip += 4 - dataToken.prefixBytesDone; dataToken.prefixBytesDone = 4; dataToken.messageLength = BitConverter.ToInt32(dataToken.byteArrayForPrefix, 0); } else { for (int i = 0; i < remainingBytesToProcess; i++) { dataToken.byteArrayForPrefix[dataToken.prefixBytesDone + i] = saea.Buffer[dataToken.DataOffset + i]; } dataToken.prefixBytesDone += remainingBytesToProcess; remainingBytesToProcess = 0; } return(remainingBytesToProcess); }
private void IO_Completed(object sender, SocketAsyncEventArgs e) { try { DataToken ioDataToken = (DataToken)e.UserToken; switch (e.LastOperation) { case SocketAsyncOperation.Receive: ProcessReceive(); break; case SocketAsyncOperation.Send: ProcessSend(); break; default: throw new ArgumentException("The last operation completed on the socket was not a receive or send"); } } catch (ObjectDisposedException) { } catch (Exception ex) { logger.Error("IO_Completed", ex); } }
public void Connect() { socket = new Socket(this.clientSettings.RemoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.Connect(this.clientSettings.RemoteEndPoint); connected = true; var buffer = new byte[this.clientSettings.BufferSize * 2]; this.sendEventArg = new SocketAsyncEventArgs(); this.sendEventArg.SetBuffer(buffer, 0, this.clientSettings.BufferSize); this.sendDataToken = new DataToken(); this.sendDataToken.bufferOffset = this.sendEventArg.Offset; this.sendEventArg.UserToken = this.sendDataToken; this.sendEventArg.AcceptSocket = socket; this.sendEventArg.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); this.receiveEventArg = new SocketAsyncEventArgs(); this.receiveEventArg.SetBuffer(buffer, this.clientSettings.BufferSize, this.clientSettings.BufferSize); this.receiveDataToken = new DataToken(); this.receiveDataToken.bufferOffset = this.receiveEventArg.Offset; this.receiveEventArg.UserToken = this.receiveDataToken; this.receiveEventArg.AcceptSocket = socket; this.receiveEventArg.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); PostReceive(); }
private void TryDequeueAndPostSend() { byte[] data = sendQueue.Dequeue(); if (data != null) { DataToken dataToken = sendDataToken; dataToken.byteArrayForMessage = data; dataToken.messageLength = data.Length; PostSend(); } else { ResetSendFlag(); } }
public int HandlePrefix(SocketAsyncEventArgs saea, DataToken dataToken, int remainingBytesToProcess) { if (remainingBytesToProcess >= 4 - dataToken.prefixBytesDone) { for (int i = 0; i < 4 - dataToken.prefixBytesDone; i++) { dataToken.byteArrayForPrefix[dataToken.prefixBytesDone + i] = saea.Buffer[dataToken.DataOffset + i]; } remainingBytesToProcess = remainingBytesToProcess - 4 + dataToken.prefixBytesDone; dataToken.bufferSkip += 4 - dataToken.prefixBytesDone; dataToken.prefixBytesDone = 4; dataToken.messageLength = BitConverter.ToInt32(dataToken.byteArrayForPrefix, 0); } else { for (int i = 0; i < remainingBytesToProcess; i++) { dataToken.byteArrayForPrefix[dataToken.prefixBytesDone + i] = saea.Buffer[dataToken.DataOffset + i]; } dataToken.prefixBytesDone += remainingBytesToProcess; remainingBytesToProcess = 0; } return remainingBytesToProcess; }
public int HandleMessage(SocketAsyncEventArgs saea, DataToken dataToken, int remainingBytesToProcess) { if (dataToken.messageBytesDone == 0) { dataToken.byteArrayForMessage = new byte[dataToken.messageLength]; } var nonCopiedBytes = 0; if (remainingBytesToProcess + dataToken.messageBytesDone >= dataToken.messageLength) { var copyedBytes = dataToken.RemainByte; nonCopiedBytes = remainingBytesToProcess - copyedBytes; Buffer.BlockCopy(saea.Buffer, dataToken.DataOffset, dataToken.byteArrayForMessage, dataToken.messageBytesDone, copyedBytes); dataToken.messageBytesDone = dataToken.messageLength; dataToken.bufferSkip += copyedBytes; } else { Buffer.BlockCopy(saea.Buffer, dataToken.DataOffset, dataToken.byteArrayForMessage, dataToken.messageBytesDone, remainingBytesToProcess); dataToken.messageBytesDone += remainingBytesToProcess; } return nonCopiedBytes; }
public void Connect() { socket = new Socket(this.clientSettings.RemoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.Connect(this.clientSettings.RemoteEndPoint); connected = true; var buffer = new byte[this.clientSettings.BufferSize * 2]; this.sendEventArg = new SocketAsyncEventArgs(); this.sendEventArg.SetBuffer(buffer, 0, this.clientSettings.BufferSize); this.sendDataToken = new DataToken(); this.sendDataToken.bufferOffset = this.sendEventArg.Offset; this.sendEventArg.UserToken = this.sendDataToken; this.sendEventArg.AcceptSocket = socket; this.sendEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(IO_Completed); this.receiveEventArg = new SocketAsyncEventArgs(); this.receiveEventArg.SetBuffer(buffer, this.clientSettings.BufferSize, this.clientSettings.BufferSize); this.receiveDataToken = new DataToken(); this.receiveDataToken.bufferOffset = this.receiveEventArg.Offset; this.receiveEventArg.UserToken = this.receiveDataToken; this.receiveEventArg.AcceptSocket = socket; this.receiveEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(IO_Completed); PostReceive(); }