複数のインターフェイスがある場合、ブロードキャストが常にすべてのインターフェイスに送信されるとは限らないため、これは実際には思ったよりもトリッキーです。これを回避するために、このクラスを作成しました。
public class MyUdpClient : UdpClient
{
public MyUdpClient() : base()
{
//Calls the protected Client property belonging to the UdpClient base class.
Socket s = this.Client;
//Uses the Socket returned by Client to set an option that is not available using UdpClient.
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
}
public MyUdpClient(IPEndPoint ipLocalEndPoint) : base(ipLocalEndPoint)
{
//Calls the protected Client property belonging to the UdpClient base class.
Socket s = this.Client;
//Uses the Socket returned by Client to set an option that is not available using UdpClient.
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
}
}
次に、UDP パケットをブロードキャストで送信するには、次のようなものを使用します。私は and を使用IPAddress.Broadcast
してMyUdpClient
いますが、これはあなたのコードとは異なります。
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(LocalIP), 0);
IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Broadcast, iTargetPort);
MyUdpClient sendUdpClient = new MyUdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
ipaddress
また、ブロードキャストの代わりに特定のものを使用する場合、ルート テーブルはアドレスに一致するインターフェイスのみを送信することに注意してください。
あなたの例では、ユニキャストが使用されています。LocalIP
送信先のローカル インターフェイスの IPに設定する必要があります。3 つのインターフェイスを使用すると、3 つのローカル IP を持つことになり、使用する正しい IP を選択する必要があります。
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(LocalIP), 0);
IPEndPoint targetEndPoint = new IPEndPoint(TargetIP, iTargetPort);
MyUdpClient sendUdpClient = new MyUdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
ルートがオフになっているため、すべてのインターフェイスでルートが表示される可能性がありますが、ユニキャストの場合にこれをテストする必要があります。
送信 IP またはポートを気にしない場合は、次のコードを使用できます。
IPEndPoint targetEndPoint = new IPEndPoint(TargetIP, iTargetPort);
MyUdpClient sendUdpClient = new MyUdpClient();
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
または放送用
IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Broadcast, iTargetPort);
MyUdpClient sendUdpClient = new MyUdpClient();
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
問題IPAddress.Broadcast
は、ゲートウェイを経由しないことです。これを回避するには、リストを作成し、IPAddresses
ループして送信します。また、制御できないネットワークの問題で送信が失敗する可能性があるため、try/catch ブロックも必要です。
ArrayList ip_addr_acq = new ArrayList();
ip_addr_acq.Add(IPAddress.Parse("10.1.1.1")); // add to list of address to send to
try
{
foreach (IPAddress curAdd in ip_addr_acq)
{
IPEndPoint targetEndPoint = new IPEndPoint(curAdd , iTargetPort);
MyUdpClient sendUdpClient = new MyUdpClient();
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
Thread.Sleep(40); //small delay between each message
}
}
catch
{
// handle any exceptions
}
編集: 複数のインターフェイスを使用したユニキャストへの上記の変更と、利用可能なネットワークにパケットをユニキャストしようとしている問題も参照してください。