/// <summary> /// Incoming data listen sync method /// </summary> private void IncomingUDPPacketWorker() { try { while (true) { if (ConnectionInfo.ConnectionState == ConnectionState.Shutdown) { break; } IPEndPoint endPoint = new IPEndPoint(IPAddress.None, 0); byte[] receivedBytes = udpClientThreadSafe.Receive(ref endPoint); if (NetworkComms.LoggingEnabled) { NetworkComms.Logger.Trace("Received " + receivedBytes.Length.ToString() + " bytes via UDP from " + endPoint.Address + ":" + endPoint.Port.ToString() + "."); } if (isIsolatedUDPConnection) { //This connection was created for a specific remoteEndPoint so we can handle the data internally //Lock on the packetbuilder locker as we may recieve udp packets in parallel from this host lock (packetBuilder.Locker) { packetBuilder.AddPartialPacket(receivedBytes.Length, receivedBytes); if (packetBuilder.TotalBytesCached > 0) { IncomingPacketHandleHandOff(packetBuilder); } } } else { //Look for an existing connection, if one does not exist we will create it //This ensures that all further processing knows about the correct endPoint UDPConnection connection = GetConnection(new ConnectionInfo(true, ConnectionType.UDP, endPoint, udpClientThreadSafe.LocalEndPoint), ConnectionDefaultSendReceiveOptions, UDPOptions, false, this); //Lock on the packetbuilder locker as we may recieve udp packets in parallel from this host lock (connection.packetBuilder.Locker) { //We pass the data off to the specific connection connection.packetBuilder.AddPartialPacket(receivedBytes.Length, receivedBytes); if (connection.packetBuilder.TotalBytesCached > 0) { connection.IncomingPacketHandleHandOff(connection.packetBuilder); } if (connection.packetBuilder.TotalPartialPacketCount > 0) { connection.packetBuilder.ClearNTopBytes(connection.packetBuilder.TotalBytesCached); //We cant close the connection here because it may be one of the shared udp listeners. For now we will just log. NetworkComms.LogError(new Exception("Packet builder had remaining packets after a call to IncomingPacketHandleHandOff. Until sequenced packets are implemented this indicates a possible error."), "UDPConnectionError"); } } } } } //On any error here we close the connection catch (NullReferenceException) { CloseConnection(true, 20); } catch (ArgumentNullException) { CloseConnection(true, 37); } catch (IOException) { CloseConnection(true, 21); } catch (ObjectDisposedException) { CloseConnection(true, 22); } catch (SocketException) { //Recieve may throw a SocketException ErrorCode=10054 after attempting to send a datagram to an unreachable target. //We will try to get around this by ignoring the ICMP packet causing these problems on client creation CloseConnection(true, 23); } catch (InvalidOperationException) { CloseConnection(true, 24); } catch (Exception ex) { NetworkComms.LogError(ex, "Error_UDPConnectionIncomingPacketHandler"); CloseConnection(true, 41); } //Clear the listen thread object because the thread is about to end incomingDataListenThread = null; if (NetworkComms.LoggingEnabled) { NetworkComms.Logger.Trace("Incoming data listen thread ending for " + ConnectionInfo); } }
void socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) { try { var stream = args.GetDataStream().AsStreamForRead(); var dataLength = args.GetDataReader().UnconsumedBufferLength; byte[] receivedBytes = new byte[dataLength]; using (MemoryStream mem = new MemoryStream(receivedBytes)) stream.CopyTo(mem); stream = null; if (NetworkComms.LoggingEnabled) { NetworkComms.Logger.Trace("Received " + receivedBytes.Length + " bytes via UDP from " + args.RemoteAddress + ":" + args.RemotePort + "."); } if (isIsolatedUDPConnection) { //This connection was created for a specific remoteEndPoint so we can handle the data internally //Lock on the packetbuilder locker as we may recieve udp packets in parallel from this host lock (packetBuilder.Locker) { packetBuilder.AddPartialPacket(receivedBytes.Length, receivedBytes); if (packetBuilder.TotalBytesCached > 0) { IncomingPacketHandleHandOff(packetBuilder); } } } else { var remoteEndPoint = new IPEndPoint(IPAddress.Parse(args.RemoteAddress.DisplayName.ToString()), int.Parse(args.RemotePort)); var localEndPoint = new IPEndPoint(IPAddress.Parse(sender.Information.LocalAddress.DisplayName.ToString()), int.Parse(sender.Information.LocalPort)); //Look for an existing connection, if one does not exist we will create it //This ensures that all further processing knows about the correct endPoint UDPConnection connection = GetConnection(new ConnectionInfo(true, ConnectionType.UDP, remoteEndPoint, localEndPoint), ConnectionDefaultSendReceiveOptions, UDPOptions, false, this); //We pass the data off to the specific connection //Lock on the packetbuilder locker as we may recieve udp packets in parallel from this host lock (connection.packetBuilder.Locker) { connection.packetBuilder.AddPartialPacket(receivedBytes.Length, receivedBytes); if (connection.packetBuilder.TotalBytesCached > 0) { connection.IncomingPacketHandleHandOff(connection.packetBuilder); } if (connection.packetBuilder.TotalPartialPacketCount > 0) { connection.packetBuilder.ClearNTopBytes(connection.packetBuilder.TotalBytesCached); //We cant close the connection here because it may be one of the shared udp listeners. For now we will just log. NetworkComms.LogError(new Exception("Packet builder had remaining packets after a call to IncomingPacketHandleHandOff. Until sequenced packets are implemented this indicates a possible error."), "UDPConnectionError"); } } } } //On any error here we close the connection catch (NullReferenceException) { CloseConnection(true, 25); } catch (ArgumentNullException) { CloseConnection(true, 38); } catch (IOException) { CloseConnection(true, 26); } catch (ObjectDisposedException) { CloseConnection(true, 27); } catch (SocketException) { //Recieve may throw a SocketException ErrorCode=10054 after attempting to send a datagram to an unreachable target. //We will try to get around this by ignoring the ICMP packet causing these problems on client creation CloseConnection(true, 28); } catch (InvalidOperationException) { CloseConnection(true, 29); } catch (Exception ex) { NetworkComms.LogError(ex, "Error_UDPConnectionIncomingPacketHandler"); CloseConnection(true, 30); } }