-1

I am having a issue I have a UDP socket open on port 49473 while one ip address is being recognized another is not. I see in wireshark packets coming from 18.x.x.x and 24.x.x.x only the 18.x.x.x packets are being read. Any ideas what might be happing? (Side note 18.x.x.x is not traversed but 24.x.x.x is not sure if that makes a difference..) Also I have tried increasing the buffer from 8192 to 150k it did not help. The buffer is not dropping packets so that ones out unfortunately..

Image from wireshark click to enlarge

    public UdpSocket(int port = 0)
    {
        sw.Start();

        _buffer.Client = this;

        if (port != 0)
            _buffer.IsHost = true;

        _discovery = new Discovery(_buffer);
        _buffer.NatOp = new NatOperation(_buffer, _buffer.IsHost);

        _endPoint = new IPEndPoint(IPAddress.Any, port);
        _buffer.Stream = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        _buffer.Stream.ReceiveBufferSize = 8192;
        _buffer.Stream.SendBufferSize = 8192;
        _buffer.Stream.EnableBroadcast = true;

        //***********Magic Fairy Dust*************
        uint IOC_IN = 0x80000000;
        uint IOC_VENDOR = 0x18000000;
        uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
        _buffer.Stream.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
        //*********** Fairy Dust End *************

        _buffer.Stream.Bind(_endPoint);

        Thread receive = new Thread(ReceiveUdp);
        Thread send = new Thread(SendThread);

        receive.IsBackground = true;
        send.IsBackground = true;

        receive.Start();
        send.Start();
    }

    private void ReceiveUdp()
    {
        while (IsRunning)
        {
            try
            {
                Packet packet = _buffer.CreatePacket();
                EndPoint _ep = new IPEndPoint(IPAddress.Any, 0);
                count = _buffer.Stream.ReceiveFrom(data, 1024, SocketFlags.None, ref _ep);

                if (((IPEndPoint)_ep).Address.ToString() != "18.x.x.x")
                    Console.WriteLine("Foreign Address Connection " + packet.RemoteEp.Address.ToString()); //never returns so 18.x.x.x only processing 

                packet.Data.MirrorData(count, data);
                packet.RemoteEp = _ep as IPEndPoint;

                packet.ReadHeader();

                lock (_inProcess)
                    _inProcess.Enqueue(packet);
            }
            catch { }
        }
    }

For anyone reading this SendTo and ReceiveFrom creates ICMP responses the magic fairy dusts disables that, this solution only works on Windows / Linux. Also I accepted the SocketOptions IP unrestricted as correct.. In my case Socket.Connect was the issue, when you do this it only allows that ip to make transfers.

Levon Ravel
  • 90
  • 1
  • 10

1 Answers1

1

This may be a NAT related problem. Do a try

_buffer.Stream.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);

before or straight after Bind. UDPClient does exactly that by method AllowNatTraversal.

Or this may be a firewall/AV related issue. Turn them off temporarly and get a try.

lilo0
  • 895
  • 9
  • 12
  • unfortunately .net 3.5 did not have the SetIPProtectionLevel I do however see that option in 4.0. I turned off the firewalls on the PC same issue. I am looking into the SetIPProtectionLevel idea to check if 3.5 has something similar. -Levon – Levon Ravel Jul 09 '18 at 15:48
  • I accepted your answer as correct because if anyone stumbles on this it could help.. In my case Socket.Connect was the issue, when you do this it only allows that ip to make requests all other ips will be ignored - Levon – Levon Ravel Jul 09 '18 at 18:56