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

Попытка одноадресной передачи пакетов в доступные сети. Всего 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);
            }
        }

В чем проблема? Благодарю.

3 ответа

Решение

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

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

Итак, вы не пытаетесь многоадресной передачи...

Каждый из ваших сетевых интерфейсов имеет 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.

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

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

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

Другие вопросы по тегам