private async Task <ServerResponse> FinishSession(Stream networkStream, Guid sessionId) { var cmdDataBytes = Serializer.Serialize(sessionId); await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.FinishSessionCmd, cmdDataBytes.Length); await NetworkHelperSequential.WriteBytes(networkStream, cmdDataBytes); var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream); if (cmdHeader.Command != Commands.FinishSessionCmd) { return new ServerResponseWithData <SyncInfo> { ErrorMsg = "Wrong command received" } } ; if (cmdHeader.PayloadLength == 0) { return new ServerResponseWithData <SyncInfo> { ErrorMsg = "No data received" } } ; var responseBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength); var response = Serializer.Deserialize <ServerResponse>(responseBytes); return(response); }
private async Task <ServerResponseWithData <Guid> > GetSession(Stream networkStream) { await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.GetSessionCmd); var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream); if (cmdHeader.Command != Commands.GetSessionCmd) { return(new ServerResponseWithData <Guid> { ErrorMsg = "Wrong command received" }); } if (cmdHeader.PayloadLength == 0) { return(new ServerResponseWithData <Guid> { ErrorMsg = "No data received" }); } var responseBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength); var response = Serializer.Deserialize <ServerResponseWithData <Guid> >(responseBytes); return(response); }
private async Task ProcessCommands() { try { var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(_networkStream); switch (cmdHeader.Command) { case Commands.GetSessionCmd: await ProcessGetSessionCmd(); break; case Commands.GetSyncListCmd: await ProcessGetSyncListCmd(cmdHeader); break; case Commands.GetFileCmd: await ProcessGetFileCmd(cmdHeader); break; case Commands.SendFileCmd: await ProcessSendFileCmd(cmdHeader); break; case Commands.FinishSessionCmd: await ProcessFinishSessionCmd(cmdHeader); break; case Commands.DisconnectCmd: _connected = false; break; default: _connected = false; break; } } catch (Exception e) { if (_connected) { Debugger.Break(); _connected = false; Console.WriteLine($"Unexpected error:\r\n{e}"); } else { // client disconnected Console.WriteLine("Unexpected error but client already disconnected, ignoring..."); } } }
private async Task <bool> ReceiveFiles(Stream networkStream, IEnumerable <SyncFileInfo> dataToDownload, SyncDatabase syncDb) { foreach (var fileInfo in dataToDownload) { var data = new GetFileCommandData { SessionId = _sessionId, RelativeFilePath = fileInfo.RelativePath, }; var dataBytes = Serializer.Serialize(data); await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.GetFileCmd, dataBytes.Length); await NetworkHelperSequential.WriteBytes(networkStream, dataBytes); var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream); if (cmdHeader.Command != Commands.GetFileCmd) { return(false); } if (cmdHeader.PayloadLength == 0) { return(false); } var fileLengthBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength); var fileLength = BitConverter.ToInt64(fileLengthBytes, 0); var tmpFilePath = Path.Combine(_newDir, fileInfo.RelativePath); var newHash = await NetworkHelperSequential.ReadToFileAndHashAsync(networkStream, tmpFilePath, (int)fileLength); if (!string.Equals(newHash.ToHashString(), fileInfo.HashStr, StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("File copy error: hash mismatch"); } _sessionFileHelper.AddNew(fileInfo.RelativePath); var fi = syncDb.Files.FirstOrDefault(x => x.RelativePath == fileInfo.RelativePath); if (fi == null) { fi = new SyncFileInfo { RelativePath = fileInfo.RelativePath, }; syncDb.Files.Add(fi); } fi.HashStr = newHash.ToHashString(); fi.State = SyncFileState.NotChanged; } return(true); }
private async Task <ServerResponseWithData <SyncInfo> > GetSyncList(Stream networkStream, Guid sessionId, List <SyncFileInfo> syncDbFiles) { var cmdData = new GetSyncListCommandData { SessionId = sessionId, Files = syncDbFiles, }; var cmdDataBytes = Serializer.Serialize(cmdData); await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.GetSyncListCmd, cmdDataBytes.Length); await NetworkHelperSequential.WriteBytes(networkStream, cmdDataBytes); var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream); if (cmdHeader.Command != Commands.GetSyncListCmd) { return new ServerResponseWithData <SyncInfo> { ErrorMsg = "Wrong command received" } } ; if (cmdHeader.PayloadLength == 0) { return new ServerResponseWithData <SyncInfo> { ErrorMsg = "No data received" } } ; var responseBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength); var response = Serializer.Deserialize <ServerResponseWithData <SyncInfo> >(responseBytes); return(response); }