Проблема при попытке одноадресной передачи пакетов в доступные сети
Попытка одноадресной передачи пакетов в доступные сети. Всего 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. В любом случае, мне любопытно посмотреть, что ты найдешь. Пожалуйста, держите нас в курсе.
Кроме того, запись адресов может быть полезной. Трасса маршрута - твой друг.