public override bool Send(IPPayload payload) { lock (deathClock) { deathClock.Restart(); } UDP udp = (UDP)payload; if (destPort != 0) { //client already created if (!(udp.DestinationPort == destPort && udp.SourcePort == srcPort)) { Log_Error("UDP packet invalid for current session (Duplicate key?)"); return(false); } } else { //create client destPort = udp.DestinationPort; srcPort = udp.SourcePort; //Multicast address start with 0b1110 if ((DestIP[0] & 0xF0) == 0xE0) { isMulticast = true; } client = new UdpClient(); client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); client.Client.Bind(new IPEndPoint(adapterIP, 0)); //needs testing if (isMulticast) { Log_Info("Is Multicast"); //client.JoinMulticastGroup(address); } else { IPAddress address = new IPAddress(DestIP); client.Connect(address, destPort); } if (srcPort != 0) { open = true; } } if (destPort == 53) { Log_Info("DNS Packet Sent To " + new IPAddress(DestIP)); Log_Info("Contents"); PacketReader.DNS.DNS pDNS = new PacketReader.DNS.DNS(udp.GetPayload()); } if (isBroadcast) { client.Send(udp.GetPayload(), udp.GetPayload().Length, new IPEndPoint(IPAddress.Broadcast, destPort)); } else if (isMulticast | isFixedPort) { client.Send(udp.GetPayload(), udp.GetPayload().Length, new IPEndPoint(new IPAddress(DestIP), destPort)); } else if (isFixedPort) { client.Send(udp.GetPayload(), udp.GetPayload().Length); } else { //As fair as I know, //this won't throw a 10061 Connection refused or 10054 Connection reset //under any probable event on windows (As much as I've tried) //Yet it can throw 10061 on linux try { client.Send(udp.GetPayload(), udp.GetPayload().Length); } catch (SocketException err) { if (!hasRetryed) { Log_Error("UDP Send Error: " + err.Message); Log_Error("Error Code: " + err.ErrorCode); Log_Error("Hiding further errors from this connection"); hasRetryed = true; } client.Close(); //recreate UDP client IPAddress address = new IPAddress(DestIP); client = new UdpClient(); client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); client.Client.Bind(new IPEndPoint(adapterIP, 0)); client.Connect(address, destPort); //And retry sending client.Send(udp.GetPayload(), udp.GetPayload().Length); } } if (srcPort == 0) { RaiseEventConnectionClosed(); } return(true); }
//bool thing = false; public override IPPayload Recv() { if (!open) { return(null); } if (isFixedPort) { lock (deathClock) { if (deathClock.Elapsed.TotalSeconds > MAX_IDLE) { Dispose(); RaiseEventConnectionClosed(); } } return(null); } bool hasData; //client may be disposed when we try to check //available data on a rejected connection try { hasData = client.Available != 0; } catch (ObjectDisposedException) { hasData = false; } if (hasData) { IPEndPoint remoteIPEndPoint; //this isn't a filter remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] recived = null; try { recived = client.Receive(ref remoteIPEndPoint); Log_Verb("Got Data"); } catch (SocketException err) { Log_Error("UDP Recv Error: " + err.Message); Log_Error("Error Code: " + err.ErrorCode); RaiseEventConnectionClosed(); return(null); } UDP iRet = new UDP(recived) { DestinationPort = srcPort, SourcePort = destPort }; if (isMulticast) { Log_Error(remoteIPEndPoint.ToString()); DestIP = remoteIPEndPoint.Address.GetAddressBytes(); //assumes ipv4 iRet.SourcePort = (UInt16)remoteIPEndPoint.Port; } lock (deathClock) { deathClock.Restart(); } if (destPort == 53) { Log_Info("DNS Packet Sent From " + remoteIPEndPoint.Address); Log_Info("Contents"); PacketReader.DNS.DNS pDNS = new PacketReader.DNS.DNS(recived); } return(iRet); } lock (deathClock) { if (deathClock.Elapsed.TotalSeconds > MAX_IDLE) { Dispose(); RaiseEventConnectionClosed(); } } return(null); }
public override bool Send(IPPayload payload) { lock (deathClock) { deathClock.Restart(); } UDP udp = (UDP)payload; if (destPort != 0) { //client already created if (!(udp.DestinationPort == destPort && udp.SourcePort == srcPort)) { Log_Error("UDP packet invalid for current session (Duplicate key?)"); return(false); } } else { //create client destPort = udp.DestinationPort; srcPort = udp.SourcePort; //Multicast address start with 0b1110 if ((DestIP[0] & 0xF0) == 0xE0) { isMulticast = true; } //needs testing if (isMulticast) { Log_Info("Is Multicast"); client = new UdpClient(new IPEndPoint(adapterIP, 0)); //client.JoinMulticastGroup(address); } else { IPAddress address = new IPAddress(DestIP); client = new UdpClient(new IPEndPoint(adapterIP, 0)); client.Connect(address, destPort); } if (srcPort != 0) { open = true; } } if (destPort == 53) { Log_Info("DNS Packet Sent To " + new IPAddress(DestIP)); Log_Info("Contents"); PacketReader.DNS.DNS pDNS = new PacketReader.DNS.DNS(udp.GetPayload()); } if (isBroadcast) { client.Send(udp.GetPayload(), udp.GetPayload().Length, new IPEndPoint(IPAddress.Broadcast, destPort)); } else if (isMulticast | isFixedPort) { client.Send(udp.GetPayload(), udp.GetPayload().Length, new IPEndPoint(new IPAddress(DestIP), destPort)); } else { client.Send(udp.GetPayload(), udp.GetPayload().Length); } if (srcPort == 0) { RaiseEventConnectionClosed(); } return(true); }