public void TotMessageTest() { Assert.Equal(TotPurpose.Ping, TotPing.Instance.Purpose); Assert.Equal(TotPurpose.Pong, TotPong.Instance(TotMessageId.Random).Purpose); Assert.Equal(TotPurpose.Success, TotResponse.Success(TotMessageId.Random).Purpose); Assert.Equal(TotPurpose.BadRequest, TotResponse.BadRequest(TotMessageId.Random).Purpose); Assert.Equal(TotPurpose.VersionMismatch, TotResponse.VersionMismatch(TotMessageId.Random).Purpose); Assert.Equal(TotPurpose.UnsuccessfulRequest, TotResponse.UnsuccessfulRequest(TotMessageId.Random).Purpose); var x = new TotRequest("status"); Assert.Equal(97, x.GetLastCellFullnessPercentage()); Assert.Equal(1, x.GetNumberOfCells()); Assert.Equal(497, x.GetNumberOfDummyBytesInLastCell()); var messages = TotMessageBase.SplitByMessages(ByteHelpers.Combine( TotPing.Instance.ToBytes(), TotPong.Instance(TotMessageId.Random).ToBytes(), TotResponse.BadRequest(TotMessageId.Random).ToBytes(), TotResponse.Success(TotMessageId.Random).ToBytes(), TotResponse.UnsuccessfulRequest(TotMessageId.Random).ToBytes(), TotResponse.VersionMismatch(TotMessageId.Random).ToBytes(), new TotRequest("fooPurpose", new TotContent("foo content")).ToBytes())); Assert.Equal(7, messages.Count()); }
private async Task ListenNetworkStreamAsync() { while (true) { try { var bufferSize = TcpClient.ReceiveBufferSize; var buffer = new byte[bufferSize]; var stream = TcpClient.GetStream(); var receiveCount = await stream.ReadAsync(buffer, 0, bufferSize).ConfigureAwait(false); // TcpClient.Disposep() will trigger ObjectDisposedException if (receiveCount <= 0) { throw new ConnectionException($"Client lost connection."); } // if we could fit everything into our buffer, then we get our message if (!stream.DataAvailable) { foreach (var messageBytes in TotMessageBase.SplitByMessages(buffer.Take(receiveCount).ToArray())) { ProcessMessageBytesAsync(messageBytes); } continue; } // while we have data available, start building a bytearray var builder = new ByteArrayBuilder(); builder.Append(buffer.Take(receiveCount).ToArray()); while (stream.DataAvailable) { Array.Clear(buffer, 0, buffer.Length); receiveCount = await stream.ReadAsync(buffer, 0, bufferSize).ConfigureAwait(false); if (receiveCount <= 0) { throw new ConnectionException($"Client lost connection."); } builder.Append(buffer.Take(receiveCount).ToArray()); } foreach (var messageBytes in TotMessageBase.SplitByMessages(builder.ToArray())) { ProcessMessageBytesAsync(messageBytes); } continue; } catch (ObjectDisposedException ex) { // If TcpListener.Stop() is called, this exception will be triggered. Logger.LogInfo <TotClient>("Client is disposed incoming connections."); Logger.LogTrace <TotClient>(ex); OnDisconnected(ex); return; } catch (ConnectionException ex) { Logger.LogDebug <TotClient>(ex, LogLevel.Debug); OnDisconnected(ex); await Task.Delay(3000).ConfigureAwait(false); // wait 3 sec, then retry } catch (IOException ex) { Logger.LogDebug <TotClient>(ex, LogLevel.Debug); OnDisconnected(ex); await Task.Delay(3000).ConfigureAwait(false); // wait 3 sec, then retry } catch (Exception ex) { Logger.LogWarning <TotClient>(ex, LogLevel.Debug); OnDisconnected(ex); await Task.Delay(3000).ConfigureAwait(false); // wait 3 sec, then retry } } }