UDP Socket получава пакети от един IP адрес, докато игнорира други

Имам проблем. Имам отворен UDP сокет на порт 49473, докато един ip адрес се разпознава, друг не. Виждам в пакетите на wireshark, идващи от 18.x.x.x и 24.x.x.x, само пакетите 18.x.x.x се четат. Някакви идеи какво може да се случи? (Странична бележка 18.x.x.x не е премината, но 24.x.x.x не е сигурен дали това има значение..) Също така се опитах да увелича буфера от 8192 на 150k, но не помогна. Буферът не изпуска пакети, така че за съжаление те излизат..

Изображение от wireshark щракнете, за да увеличите

    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 { }
        }
    }

За всеки, който чете това SendTo и ReceiveFrom създава ICMP отговори, магическият приказен прах деактивира това, това решение работи само на Windows / Linux. Също така приех SocketOptions IP unrestricted като правилен.. В моя случай Socket.Connect беше проблемът, когато правите това, той позволява само този ip да извършва трансфери.


person Levon Ravel    schedule 09.07.2018    source източник
comment
Трябва ли да използвате recv() вместо recvFrom()?   -  person PaulHK    schedule 09.07.2018
comment
@PaulHK recv() не включва крайната точка, аз използвам recvFrom(), за да включа крайната точка на изпращача за по-късни употреби.   -  person Levon Ravel    schedule 09.07.2018
comment
@PaulHK Не можете да използвате recv() на несвързан UDP сокет.   -  person user207421    schedule 10.07.2018
comment
Позволете ми да прикача източника на магическия приказен прах   -  person Lies    schedule 28.12.2020


Отговори (1)


Това може да е проблем, свързан с NAT. Опитайте

_buffer.Stream.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);

преди или веднага след Bind. UDPClient прави точно това чрез метода AllowNatTraversal .

Или това може да е проблем, свързан със защитна стена/AV. Изключете ги временно и опитайте.

person lilo0    schedule 09.07.2018
comment
за съжаление .net 3.5 нямаше SetIPProtectionLevel, но виждам тази опция в 4.0. Изключих защитните стени на компютъра със същия проблем. Разглеждам идеята SetIPProtectionLevel, за да проверя дали 3.5 има нещо подобно. -Левон - person Levon Ravel; 09.07.2018
comment
Приех отговора ви за правилен, защото ако някой се натъкне на това, може да помогне.. В моя случай Socket.Connect беше проблемът, когато направите това, той позволява само на този ip да прави заявки, всички други ip ще бъдат игнорирани - Levon - person Levon Ravel; 09.07.2018