/* * Core methods of Disquuun. */ /** * method for Sync execution of specific Disque command. * DEPRECATED. only use for testing. */ public override DisquuunResult[] DEPRECATED_Sync(DisqueCommand command, byte[] data) { try { socketToken.socket.Send(data); var currentLength = 0; var scanResult = new DisquuunAPI.ScanResult(false); while (true) { // waiting for head of transferring data or rest of data. socketToken.socket.Receive(socketToken.receiveBuffer, currentLength, 1, SocketFlags.None); currentLength = currentLength + 1; var available = socketToken.socket.Available; var readableLength = currentLength + available; { if (socketToken.receiveBuffer.Length < readableLength) { // Disquuun.Log("サイズオーバーしてる " + socketToken.receiveBuffer.Length + " vs:" + readableLength); Array.Resize(ref socketToken.receiveBuffer, readableLength); } } // read rest. socketToken.socket.Receive(socketToken.receiveBuffer, currentLength, available, SocketFlags.None); currentLength = currentLength + available; scanResult = DisquuunAPI.ScanBuffer(command, socketToken.receiveBuffer, 0, currentLength, socketId); if (scanResult.isDone) { break; } // continue reading data from socket. // if need, prepare for next 1 byte. if (socketToken.receiveBuffer.Length == readableLength) { Array.Resize(ref socketToken.receiveBuffer, socketToken.receiveBuffer.Length + 1); } } socketToken.socketState = SocketState.OPENED; return(scanResult.data); } catch (Exception e) { DisquuunLogger.Log("DEPRECATED_Sync error:" + e, true); throw e; } }
private void LoopOrAsyncReceive(SocketToken token) { var currentCommand = token.currentCommands.Peek(); var result = DisquuunAPI.ScanBuffer(currentCommand, token.receiveBuffer, 0, token.readableDataLength, socketId); if (result.isDone && result.cursor == token.readableDataLength) { // update continuation status. token.continuation = token.AsyncCallback(currentCommand, result.data); if (token.continuation) { switch (token.socketState) { case SocketState.BUSY: { token.socketState = SocketState.RECEIVED; break; } case SocketState.SENDED: { // ready for next loop receive. token.readableDataLength = 0; token.receiveArgs.SetBuffer(token.receiveBuffer, 0, token.receiveBuffer.Length); if (!token.socket.ReceiveAsync(token.receiveArgs)) { OnReceived(token.socket, token.receiveArgs); } try { token.sendArgs.SetBuffer(token.currentSendingBytes, 0, token.currentSendingBytes.Length); } catch { // renew. potential error is exists and should avoid this error. var sendArgs = new SocketAsyncEventArgs(); sendArgs.RemoteEndPoint = token.receiveArgs.RemoteEndPoint; sendArgs.Completed += new EventHandler <SocketAsyncEventArgs>(OnSend); sendArgs.UserToken = token; token.sendArgs = sendArgs; token.sendArgs.SetBuffer(token.currentSendingBytes, 0, token.currentSendingBytes.Length); } if (!token.socket.SendAsync(token.sendArgs)) { OnSend(token.socket, token.sendArgs); } break; } default: { // closing or other state. should close. break; } } return; } // end of loop or end of async. switch (token.socketState) { case SocketState.BUSY: { token.socketState = SocketState.RECEIVED; break; } case SocketState.SENDED: { token.socketState = SocketState.OPENED; SocketReloaded(this); break; } default: { break; } } return; } // not yet received all data. // continue receiving. StartContinueReceiving(token, token.readableDataLength); }
private void PipelineReceive(SocketToken token) { var fromCursor = 0; /* * read data from receiveBuffer by moving fromCursor. */ while (true) { var currentCommand = token.currentCommands.Peek(); var result = DisquuunAPI.ScanBuffer(currentCommand, token.receiveBuffer, fromCursor, token.readableDataLength, socketId); if (result.isDone) { token.AsyncCallback(currentCommand, result.data); // deque as read done. token.currentCommands.Dequeue(); if (token.currentCommands.Count == 0) { // pipelining is over. switch (token.socketState) { case SocketState.BUSY: { token.socketState = SocketState.RECEIVED; break; } case SocketState.SENDED: { token.socketState = SocketState.OPENED; SocketReloaded(this); break; } default: { break; } } return; } // commands are still remained. // got all data is just consumed. get rest from outside. if (fromCursor == token.readableDataLength) { StartContinueReceiving(token, 0); return; } // rest pipeline commands and received data is exists in buffer. fromCursor = result.cursor; continue; } /* * reading is not completed. the fragment of command exists. */ var fragmentDataLength = token.readableDataLength - fromCursor; // move fragment data to head of buffer. Buffer.BlockCopy(token.receiveBuffer, fromCursor, token.receiveBuffer, 0, fragmentDataLength); StartContinueReceiving(token, fragmentDataLength); break; } }