public bool HandleMessage(SocketAsyncEventArgs receiveSendEventArgs, DataHoldingUserToken receiveSendToken) { var logger = LogManager.GetLogger(this.GetType()); bool incomingTcpMessageIsReady = false; var currentChunk = new byte[receiveSendEventArgs.BytesTransferred]; Array.Copy(receiveSendEventArgs.Buffer, currentChunk, receiveSendEventArgs.BytesTransferred); // Look for delimiter in bytes var delimiterPos = SearchBytes(currentChunk, receiveSendToken.messageDelimiter); if (delimiterPos < 0) { logger.Debug("No delimiter yet for token: " + receiveSendToken.TokenId); // No delimiter. We need to receive more data... // Append data to the token buffer receiveSendToken.theDataHolder.Append(receiveSendEventArgs.Buffer, receiveSendEventArgs.BytesTransferred); receiveSendToken.bytesAlreadyRead += receiveSendEventArgs.BytesTransferred; receiveSendToken.receiveMessageOffset = 0; // receive more... } else { logger.Debug("Found the end of a message! Token: " + receiveSendToken.TokenId); receiveSendToken.theDataHolder.Append(receiveSendEventArgs.Buffer, delimiterPos); // read up until before the delimiter receiveSendToken.bytesAlreadyRead += delimiterPos + receiveSendToken.messageDelimiter.Length - 1; receiveSendToken.receiveMessageOffset = delimiterPos + receiveSendToken.messageDelimiter.Length; incomingTcpMessageIsReady = true; } return(incomingTcpMessageIsReady); }
public static void CloseConnection(string name) { if (!_sockets.ContainsKey(name)) { throw new Exception($"No connection with name {name} exists"); } var sock = _sockets[name]; var e = new SocketAsyncEventArgs(); sock._bufferManager.SetBuffer(e); var bytes = Encoding.UTF8.GetBytes(""); var recSendToken = new DataHoldingUserToken(bytes, Guid.NewGuid().ToString(), null); recSendToken.CreateNewDataHolder(); e.UserToken = recSendToken; sock.StartDisconnect(e); _sockets.Remove(name); }
public void StartReceiving(Func <byte[], bool> onReceive, byte[] messageDelimiter) { var e = new SocketAsyncEventArgs(); _bufferManager.SetBuffer(e); var recSendToken = new DataHoldingUserToken(messageDelimiter, Guid.NewGuid().ToString(), onReceive); //Create an object that we can write data to, and remove as an object //from the UserToken, if we wish. recSendToken.CreateNewDataHolder(); e.UserToken = recSendToken; e.Completed += (sender, args) => { try { LogManager.GetLogger(this.GetType()).Debug("IO_Completed method accessed with op: " + args.LastOperation); // determine which type of operation just completed and call the associated handler switch (args.LastOperation) { case SocketAsyncOperation.Connect: LogManager.GetLogger(this.GetType()).Debug("IO_Completed method In Connect. NOT IMPLEMENTED!"); //ProcessConnect(e); break; case SocketAsyncOperation.Receive: var recToken = (DataHoldingUserToken)e.UserToken; LogManager.GetLogger(this.GetType()).Debug("IO_Completed method In Receive, id = " + recToken.TokenId); ProcessReceive(args); break; case SocketAsyncOperation.Send: var sendToken = (DataHoldingUserToken)e.UserToken; LogManager.GetLogger(this.GetType()).Debug("IO_Completed method In Send, id = " + sendToken.TokenId + ". NOT IMPLEMENTED!"); //ProcessSend(e); break; case SocketAsyncOperation.Disconnect: var disconnectToken = (DataHoldingUserToken)e.UserToken; LogManager.GetLogger(this.GetType()).Debug("IO_Completed method In Disconnect, id = " + disconnectToken.TokenId + ". NOT IMPLEMENTED!"); //ProcessDisconnectAndCloseSocket(e); break; default: { var errorToken = (DataHoldingUserToken)e.UserToken; LogManager.GetLogger(this.GetType()).Debug("Error in I/O Completed, id = " + errorToken.TokenId + ". NOT IMPLEMENTED!"); throw new ArgumentException("\r\nError in I/O Completed, id = " + errorToken.TokenId); } } } catch (Exception err) { var errorToken = (DataHoldingUserToken)e.UserToken; LogManager.GetLogger(this.GetType()).Error("EXCEPTION in I/O Completed, id = " + errorToken.TokenId + ".", err); } }; _socket.ReceiveAsync(e); }