Имам проблем. Имам отворен 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 да извършва трансфери.
recv()
на несвързан UDP сокет. - person user207421   schedule 10.07.2018