2009-04-30 8 views
2

Windows XP以降のソリューション。好ましくはC#またはC++で。特定のアダプタ(192.168.101.1など)からのUDPブロードキャスト(255.255.255.255)のみを送信します。 Windowsの場合

私たちが連絡しようとしているデバイスがこれに応答していないため、サブネット向けブロードキャスト(192.168.101.255など)を使用してブロードキャストしたくないです。代わりに、ブロードキャストが他のNICで送信されないように、宛先が255.255.255.255のUDPデータグラムを特定のNIC/IPAddressからのみ送信できるようにする必要があります。

これは、私たちがIPスタックを迂回しなければならないことを意味します。つまり、これは疑問です。特定のNIC/MACアドレスからのみUDP/IP準拠のデータグラムを送信するために、Windows上のIPスタックを回避するにはどうすればよいですか?

答えて

2

INADDR_ANYを使用する代わりに、ソケットを目的のインターフェイスにbind()するだけですか?

// Make a UDP socket 
SOCKET s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 
// Bind it to a particular interface 
sockaddr_in name={0}; 
name.sin_family = AF_INET; 
name.sin_addr.s_addr = inet_addr("192.168.101.3"); // whatever the ip address of the NIC is. 
name.sin_port = htons(PORT); 
bind(s,(sockaddr*)name); 
+1

これはC#で直接可能ですか?または、例えば独自のラッパーを作成する必要がありますか? C++/CLI? – nietras

+0

var localEndPoint =新しいIPEndPoint(IPAddress.Parse( "192.168.103.1")、0); using(var socket = new UdpClient(localEndPoint)) { var remoteEndPoint = new IPEndPoint(IPAddress.Parse( "255.255.255.255")、3956); var datagram =新しいバイト[] {0x11、0x22、0x33、0x44}; //ブロードキャストデータグラムをローカルエンドポイントからのみ送信しようとしています //ただし、sendはWireshark socket.Send(datagram、datagram.Length、remoteEndPoint)に従ってすべてのNICからパケットをブロードキャストします。 } – nietras

+0

まあ、どうやってコードを正しく貼り付けますか? Anyhoo、これはうまくいかないので、与えられた答えはうまくいかない。 – nietras

1

私はこれを試していないが、私はWinPcapのは、あなたが生sendを行うことができますことを知っています。それは非常に低いレベルで動作するので、完全なブロードキャストをバイパスするためにスタック上で十分に低い送信を許可する可能性があります。そこにはさまざまなC#ラッパーがあります。もちろん、通常のC/C++コードを使用することもできます。私は、トリックはあなたが送信したいと思う右のアダプタにバインドするかもしれないと思うし、それはちょうど動作するかもしれません。

2

WinPcapを使用してC#でraw pcaketを送信するには、Pcap.Netを使用できます。 C++/CLIとC#で書かれたWinPcapのラッパーで、パケットの解釈と作成のフレームワークが含まれています。

関連する問題