private void ParseMessage(UdpReceiveResult result, SpideyTcpServer tcpServer, IProgress <ConnectedPlayerInformation> onLocationUpdate, IProgress <ConnectedPlayerUdpEndPoint> onReceiveUdpInfo) { if (result.Buffer.Length < SpideyUdpMessage.MESSAGE_HEADER_SIZE) { return; } var message = result.Buffer; var messageType = message[0]; byte playerNumber; switch (messageType) { case SpideyUdpMessage.SPIN_A_WEB: if (!SpideyUdpMessage.ParseSpinAWebMessage(message, out playerNumber)) { break; } var added = tcpServer.AddUdpClientInformation(playerNumber, result.RemoteEndPoint); if (added) { ++_playerCount; onReceiveUdpInfo.Report(new ConnectedPlayerUdpEndPoint(playerNumber, new IPEndPoint(result.RemoteEndPoint.Address, result.RemoteEndPoint.Port))); } break; case SpideyUdpMessage.SPIDERMAN: if (!SpideyUdpMessage.ParseSpidermanMessage(message, out playerNumber, out byte[] spideyData, out byte levelData))
private void ReadFromMemory(object state) { lock (_memoryTimerLock) { var timer = state as Timer; if (timer != _memoryTimer || _memoryTimer == null) { return; } var spideyData = MemoryScanner.ReadSpideyData(); var levelData = MemoryScanner.ReadLevelData(); var message = SpideyUdpMessage.CreateSpidermanMessage(_myInfo.Number, spideyData, levelData); foreach (var udpClient in udpWebSwing) { udpClient.Send(message, message.Length); } var spideyLevel = SpideyLevels.GetSpideyLevel(levelData); var location = spideyLevel.Name.TrimEnd(); _onLocationUpdate.Report(new ConnectedPlayerInformation(_myInfo.Number, location)); _udpBase.MyLastLocation = location; } }
public async Task StartListening(IProgress <bool> onConnected, IProgress <ConnectedPlayerInformation> onLocationUpdate) { await _tcpConnected.WaitAsync(); var myPlayerNumber = _myPlayerNumber; var udpClient = new UdpClient(); var serverEndPoint = new IPEndPoint(_serverIp, _port); try { var gameStarted = false; while (!gameStarted && !_udpTaskCancellationToken.IsCancellationRequested) { try { // Do not call connect otherwise hole punching will not work //udpClient.Connect(_serverIp, _port); onConnected.Report(true); var message = SpideyUdpMessage.CreateSpinAWebMessage(myPlayerNumber); while (!gameStarted) { udpClient.Send(message, message.Length, serverEndPoint); gameStarted = await _gameStarted.WaitAsync(GAME_STARTED_TIMEOUT_MS); } } catch (SocketException) { onConnected.Report(false); await Task.Delay(100); } } while (!_udpTaskCancellationToken.IsCancellationRequested) { var result = await udpClient.ReceiveAsync().WithWaitCancellation(_udpTaskCancellationToken.Token); ParseMessage(result, onLocationUpdate); } } catch (OperationCanceledException) { } finally { if (udpClient.Client.Connected) { udpClient.Close(); } } }
private void ParseMessage(UdpReceiveResult result, IProgress <ConnectedPlayerInformation> onLocationUpdate) { if (result.Buffer.Length < SpideyUdpMessage.MESSAGE_HEADER_SIZE) { return; } var message = result.Buffer; var messageType = message[0]; byte playerNumber; switch (messageType) { case SpideyUdpMessage.SPIN_A_WEB: // Not supported break; case SpideyUdpMessage.SPIDERMAN: if (!SpideyUdpMessage.ParseSpidermanMessage(message, out playerNumber, out byte[] spideyData, out byte levelData))