Mam następujący kod do zapoznania multicast wiadomości pochodzących z sieci, dla określonego IP + portUDP: Odczyt danych ze wszystkich interfejsów sieciowych
private static void ReceiveMessages(int port, string ip, CancellationToken token)
{
Task.Factory.StartNew(() =>
{
using (var mUdpClientReceiver = new UdpClient())
{
var mReceivingEndPoint = new IPEndPoint(IPAddress.Any, port);
mUdpClientReceiver.ExclusiveAddressUse = false;
mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
mUdpClientReceiver.ExclusiveAddressUse = false;
mUdpClientReceiver.Client.Bind(mReceivingEndPoint);
mUdpClientReceiver.JoinMulticastGroup(IPAddress.Parse(ip), 255);
while (!token.IsCancellationRequested)
{
byte[] receive = mUdpClientReceiver.Receive(ref mReceivingEndPoint);
Console.WriteLine("Message received from {0} ",mReceivingEndPoint);
}
}
});
}
mam dwie karty sieciowe, z którego mam dane przychodzące na ten multicastowy port ip + (potwierdzone przez dwa wystąpienia monitorowania przez sieć Wireshark każdej karty sieciowej). Widzę na wireshark dużo ruchu przychodzącego na ten port + Ip) dla obu kart sieciowych.
Problem polega na tym, że na mojej konsoli widzę tylko wiadomości przychodzące z jednej karty sieciowej.
I podwójne sprawdzane netstat, nie mam żadnego innego oprogramowania słuchania na moim porcie:
Więc Dlaczego otrzymuję od ruchu tylko jeden z moich dwóch kart sieciowych?
EDIT:
Próbowałem nawet, co następuje:
private static void ReceiveMessages(int port, string ip, CancellationToken token, IEnumerable<IPAddress> ipAddresses)
{
foreach (IPAddress ipAddress in ipAddresses)
{
IPAddress ipToUse = ipAddress;
Task.Factory.StartNew(() =>
{
using (var mUdpClientReceiver = new UdpClient())
{
var mReceivingEndPoint = new IPEndPoint(ipToUse, port);
mUdpClientReceiver.ExclusiveAddressUse = false;
mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
mUdpClientReceiver.ExclusiveAddressUse = false;
mUdpClientReceiver.Client.Bind(mReceivingEndPoint);
mUdpClientReceiver.JoinMulticastGroup(IPAddress.Parse(ip), 255);
Console.WriteLine("Starting to listen on "+ipToUse);
while (!token.IsCancellationRequested)
{
byte[] receive = mUdpClientReceiver.Receive(ref mReceivingEndPoint);
Console.WriteLine("Message received from {0} on {1}", mReceivingEndPoint,ipToUse);
}
}
});
}
}
widzę „Uruchamianie słuchać na theCorrectIP” dwukrotnie (dla moich dwóch adresów IP), ale nadal wyświetla pochodzące wyłącznie dane z jednej karty sieciowej.
EDIT 2
Zauważyłem coś innego, co jest dziwne, zbyt. Jeśli wyłączę interfejs, na który otrzymuję wszystkie dane, a następnie uruchamiam oprogramowanie, otrzymuję teraz dane z innego interfejsu. Jeśli ponownie aktywuję interfejs i zrestartuję oprogramowanie, nadal otrzymuję ruch z niezajętej karty.
I wiem na pewno, że mam urządzeń, które odpowiadają mi, że są podłączone tylko do jednej sieci (nie oba)
EDIT 3
Kolejna rzecz: jeśli mogę wysłać wiadomość ode mnie (localhost), na całej mojej karcie sieciowej, widzę, że nadchodzą na moich dwóch interfejsach sieciowych. ALE jeśli uruchomię mój program dwa razy, tylko pierwszy program otrzyma wiadomości, a nie drugi.
Edycja 4
Dodatkowe info, po pierwszym komentarzu: mam dwie karty Ethernet, jeden z 10.10.24.78
IP, drugi z 10.9.10.234
ip. To nie ja wysyłam dane, ale elementy sieciowe (port 5353
z tym adresem IP jest znanym adresem multiemisji używanym dla mDNS, więc powinienem odbierać ruch z takich rzeczy jak drukarka, itunes, macs i inne utworzone przez nas oprogramowanie) . Dane są przesyłane multicastowo na adres ip 224.0.0.251
i port 5353
.
Oto kod, który można użyć do wysyłania danych na różnych adresach IP, ale jak opisałem, jeśli uruchomisz go w lokalnym prawie działa (z wyjątkiem, że tylko jeden lokalny klient otrzymuje wiadomość).
private static void SendManuallyOnAllCards(int port, string multicastAddress, IEnumerable<IPAddress> ipAddresses)
{
foreach (IPAddress remoteAddress in ipAddresses)
{
IPAddress ipToUse = remoteAddress;
using (var mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse(multicastAddress)));
mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255);
mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
var ipep = new IPEndPoint(ipToUse, port);
//IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(multicastAddress), port);
mSendSocket.Bind(ipep);
mSendSocket.Connect(ipep);
byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message");
mSendSocket.Send(bytes, bytes.Length, SocketFlags.None);
}
}
}
EDIT 5 Oto wynik mojego route print
(nie wiedziałem, że polecenia), a na moich dwóch adresów IP, zawsze otrzymują dane na temat 10.9.10.234
Edytuj 6
próbowałem kilka innych rzeczy:
- Użyj gniazdo otrzymywać zamiast UdpClient -> Nie działa
- ustawić kilka dodawania socketOption na czytniku (DontRoute = 1, Broadcast = 1) -> Nie działa
- Określ MulticastInterface że gniazdo czytnika musi używać (używając socketOption MulticastInterface) -> Nie działało
Jakie są twoje interfejsy (ethernet, eth/wlan)? A jakie masz IP na tych interfejsach? Byłoby bardziej pomocne, gdybyś mógł przeanalizować, w jaki sposób wysyłasz wiadomość multiemisji. – PCoder
@PCoder: Dzięki za komentarz, dodałem kilka szczegółów na temat mojego pierwszego pytania (Edit 4) – J4N
Czy możesz pokazać nam wynik polecenia 'route print'? – PCoder