c# - UDP Socket 从一个 IP 地址接收数据包,而忽略其他 IP 地址
问题描述
我遇到了一个问题,我在端口 49473 上打开了一个 UDP 套接字,而一个 IP 地址被识别,另一个未被识别。我在来自 18.xxx 和 24.xxx 的 wireshark 数据包中看到只有 18.xxx 数据包被读取。任何想法可能会发生什么?(旁注 18.xxx 没有被遍历,但 24.xxx 不确定这是否会有所不同。)我还尝试将缓冲区从 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 进行传输。
解决方案
这可能是与 NAT 相关的问题。试一试
_buffer.Stream.SetIPProtectionLevel(IPProtectionLevel.Unrestricted);
之前或之后Bind
。UDPClient
正是通过AllowNatTraversal方法完成的。
或者这可能是与防火墙/AV 相关的问题。暂时关闭它们并尝试一下。
推荐阅读
- sql - SQL 架构站点排行榜
- java - JavaFX:自定义组件仅在 Runnable JAR 中引发 LoadException
- r - 使用汇总方法从 geom_abline() 获取平均截距和斜率
- python - 为什么这个列表减法循环不会同时删除 b 和 c?
- mysql - 将 MySQL 表列类型从 INT 更改为 BIGINT
- go - 文件被复制到根目录以及目标目录
- c# - 如何在 C# 中的另一列条件下对 DatagridView 中的数据求和?
- javascript - 如何在反应中使用上下文在类和功能组件之间共享状态?
- python - 我需要“如果”一次但不结束循环
- system-verilog - 如何删除 if 语句中的重复代码