使用mDNS在C#中查找本地设备的IP地址

时间:2012-04-29 06:13:55

标签: c# ip-address mdns

我有3台摄像机,其MAC和IP地址对我来说是未知的,我想连接它们。

我用UTP线将它们连接到我的电脑。现在我要做的是找到他们的IP地址以建立连接。在相机的API中,它声明您可以使用TCP / IP从相机获取视频流并使用mDNS查找其IP地址。

如何在c#中找到IP地址?

(注意:没有需要的路由器和“arp -a”命令不起作用)

2 个答案:

答案 0 :(得分:0)

在某些设备上,MAC地址打印在标签上,可能在背面。 据我所知,他们需要至少在arp缓存中一次。但是这个缓存只存储5个(?)条目,因此您可能需要刷新它,或者在连接设备或运行配置工具之前将其清除。

答案 1 :(得分:0)

发送此mDNS数据包似乎对具有Raspberry Pi的应用程序有效。我认为IP /端口专用于ZeroConf / Bonjour,它似乎已被广泛使用,因此可能适用于这些摄像机。

public void sendDiscoveryQuery(string local_dhcp_ip_address)
{
    // multicast UDP-based mDNS-packet for discovering IP addresses

    System.Net.Sockets.Socket socket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);

    socket.Bind(new IPEndPoint(IPAddress.Parse(local_dhcp_ip_address), 52634));
    IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("224.0.0.251"), 5353);

    List<byte> bytes = new List<byte>();

    bytes.AddRange(new byte[] { 0x0, 0x0 });  // transaction id (ignored)
    bytes.AddRange(new byte[] { 0x1, 0x0 });  // standard query
    bytes.AddRange(new byte[] { 0x0, 0x1 });  // questions
    bytes.AddRange(new byte[] { 0x0, 0x0 });  // answer RRs
    bytes.AddRange(new byte[] { 0x0, 0x0 });  // authority RRs
    bytes.AddRange(new byte[] { 0x0, 0x0 });  // additional RRs
    bytes.AddRange(new byte[] { 0x05, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01 });  // _http._tcp.local: type PTR, class IN, "QM" question

    socket.SendTo(bytes.ToArray(), endpoint);
}

“ local_dhcp_ip_address”是计算机网卡的IP地址。以下是此交互的wireshark跟踪。设备直接响应您的计算机。

enter image description here

这时ARP -a应该起作用。您也可以使用GetIpNetTable