I次のコードは、指定したIP +ポートUDP:すべてのネットワーク・インタフェースからデータを読む
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);
}
}
});
}
私は2つのネットワークアダプタをしましたしましたから、ためにネットワークからマルチキャストメッセージを、読むことをしましたこのマルチキャストIP +ポート上のデータは、各ネットワークアダプタを監視するwiresharkの2つのインスタンスによって確認されます。私は両方のネットワークカードのためにwiresharkでこれらのポート+ Ipに来る多くのトラフィックを見る)。
問題は私のコンソール上で、私は唯一のネットワークカードからのメッセージを参照してくださいということです。私はnetstatコマンドで確認倍増
は、私は私のポートで待機して他のソフトウェアを持っていない:
なぜ私は2枚のネットワークカードの一つだけからのトラフィックを取得していますか?
EDIT:
私も次のことを試してみました:
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);
}
}
});
}
}
私は二回(私の2つのIP用)「theCorrectIPリッスンするように開始」を参照してください、それはまだ来てデータだけを表示します1つのネットワークカードから。私はあまりにも奇妙である何かを気づかなかった
EDIT 2
。すべてのデータを受信したインターフェイスを無効にしてソフトウェアを起動すると、もう一方のインターフェイスからデータが取得されます。インターフェイスを再度アクティブにしてソフトウェアを再起動すると、非アクティブ化されていないカードにトラフィックが残ります。
そして私は、私は1つのネットワークのみ(両方ではない)に接続されている私には対応機器を、したことを確かに知って
EDIT 3
もう一つは:私は、メッセージを送信する場合私(localhost)から、私が持っているすべてのネットワークカードで、私はそれらが私の2つのネットワークインターフェイスに来るのを見ます。しかし、プログラムを2回起動すると、最初のプログラムだけがメッセージを取得し、2回目は取得しません。
編集4
最初のコメント以下の追加情報、: 私は2枚のイーサネットカード、10.10.24.78
IPを持つ1、10.9.10.234
IPと他をしました。 これは、データを送信する私ではありませんが、ネットワークピース(このIPのポート5353
はmDNSのために使用するマルチキャストアドレスを知っているので、私は、プリンタ、iTunesの、マックのようなものからのトラフィックを受信する必要があり、およびソフトウェアのいくつかの他の作品は、私たちが作成しました) 。データは、IP 224.0.0.251
とポート5353
にマルチキャストされています。ここで
あなたはseveralsのIPアドレスにデータを送信するために使用することができたコードですが、(一つだけのローカルクライアントがメッセージを受け取ることを除いて)それはほとんど動作しますローカルでそれを開始した場合のように、私は、説明しました。
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 は、(そのコマンドを知らなかった)私のroute print
の結果であり、そして私の2つのIP上で、私は常に編集6 10.9.10.234
上のデータを受信
は、私はいくつかの他のものを試してみました:
-
>働いていませんでした
- MulticastInterfaceを指定 - >
- はリーダー(dontrouteは= 1、放送= 1)の上にいくつかの追加のsocketOptionを設定して働いていませんでした -
- ではなくUdpClientの受信にソケットを使用します(socketOption MulticastInterfaceを使用して)リーダーソケットが使用する必要があります - >動作しませんでした。
あなたのインターフェイス(ethernet、eth/wlan)は何ですか?そして、これらのインターフェース上でどのようなIPを持っていますか?マルチキャストメッセージの送信方法を分析できると便利です。 – PCoder
@PCoder:ご意見ありがとうございました。私の最初の質問(編集4)の詳細を追加しました – J4N
'route print'コマンドの出力を表示できますか? – PCoder