Проблема. Попытка индивидуальной рассылки пакетов в доступные сети.

StackOverflow https://stackoverflow.com/questions/1096497

  •  11-09-2019
  •  | 
  •  

Вопрос

Попытка одноадресной рассылки пакетов в доступные сети.Всего 3 сети.Удалось получить пакеты только в одной сети. Но я не могу получать пакеты в разных сетях.

используя этот код..

        foreach (var i in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
        {
            foreach (var ua in i.GetIPProperties().UnicastAddresses)
            {
                System.Windows.Forms.MessageBox.Show(ua.Address.ToString());
                IPAddress Tip = IPAddress.Parse(ua.Address.ToString());
                IPEndPoint targetEndPoint = new IPEndPoint(Tip, iTargetPort);
                MyUdpClient sendUdpClient = new MyUdpClient();
                int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
            }
        }

В чем проблема?Спасибо.

Это было полезно?

Решение

Я думаю, что ты пытаешься отправлять пакеты самому себе?

Вы уверены, что не путаете одноадресные и многоадресные адреса?

Итак, вы не пытаетесь использовать многоадресную рассылку...

Каждый ваш сетевой интерфейс имеет IP-адрес.Здесь вы отправляете пакет на свою сетевую карту.На самом деле дело не в сети, потому что ваша машина, скорее всего, знает свои собственные IP-адреса и перенаправляет их на 127.0.0.1.

Другие советы

Поскольку у вас более одного интерфейса, вы являетесь многосетевым.Для каждого интерфейса у вас будет IP-адрес.Таким образом, с тремя интерфейсами у вас будет три локальных IP-адреса.Когда вы используете UdpClient, вам необходимо указать, какой интерфейс отправлять, используя его IP-адрес.

предположим, что у вас есть следующие три локальных IP-адреса

10.1.0.1
10.2.0.1
10.4.0.1
с сетевой маской 255.255.0.0

и вы хотите отправить UDP-пакет на 10.2.5.5, вам нужно отправить его на 10.2.0.1, поэтому используйте следующий код

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("10.2.0.1"), 0);
IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Parse("10.2.5.5"), iTargetPort);
UdpClient sendUdpClient = new UdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);

и чтобы отправить пакет UDP на 10.1.90.5, вам нужно отправить его на 10.1.0.1, поэтому используйте следующий код

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("10.1.0.1"), 0);
IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Parse("10.1.90.5"), iTargetPort);
UdpClient sendUdpClient = new UdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);

Разница между ними заключается в localEndPoint и targetEndPoint.

Я не большой сетевой гуру, но попробую.Я предполагаю, что все пакеты отправляются через интерфейс по умолчанию, который знает три адреса:это собственный, петлевой и шлюзовой.Поэтому пакет от 192.168.1.111, предназначенный для 10.10.1.117, должен будет пройти через шлюз по умолчанию (скажем так, это 192.168.1.1), но что, если 192.168.1.1 не знает маршрута до 10.10.0.0, тогда хост назначения недостижимо, да?Я не знаю, это мое предположение.

Хотя, возможно, я ошибаюсь.Возможно, он не использует устройство по умолчанию, а вместо этого использует все доступные интерфейсы вместе со стеком TCP/IP.В любом случае, мне любопытно посмотреть, что вы найдете.Пожалуйста, держите нас в курсе.

Кроме того, может быть полезно записать адреса.Маршрут трассировки — ваш друг.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top