我的 iPad 无法“看到”网络上的 bonjour 设备。所以我想发送一个UDP MDNS数据包,这样网络就会把网络上最新的设备给IP,这样我就可以在iPad上进行镜像了。我能够创建一个套接字,但我发送的数据不正确。有什么想法吗?
struct icmphdr
{
u_int16_t qr; /* type sub-code */
u_int16_t opcode;
u_int16_t aa;
u_int16_t tc;
u_int16_t rd;
u_int16_t ra;
u_int16_t z;
u_int16_t ad;
u_int16_t cd;
u_int16_t rcode;
u_int16_t q_count;
}
// Create the socket connection
int sd = socket(AF_INET, SOCK_DGRAM, 0);
// Configure the port and ip we want to send to
struct sockaddr_in broadcastAddr; // Make an endpoint
memset(&broadcastAddr, 0, sizeof (broadcastAddr));
broadcastAddr.sin_family = AF_INET;
broadcastAddr.sin_len = sizeof(broadcastAddr);
broadcastAddr.sin_addr.s_addr = htonl(INADDR_ANY);
broadcastAddr.sin_addr.s_addr = inet_addr("224.0.0.251");
broadcastAddr.sin_port = htons(5353); // Set port 5353
bind (sd, (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr));
struct icmphdr req;
req.qr=00; // Reponse: Message is query
req.opcode=00; // Opcode: Standard Query (0)
req.tc=00; // Truncated: Message is not truncated
req.rd=00; // Recursion desired: Don't do query recursively
req.z=00; // Z: reserved (0)
req.ad=00; // Non-authenticated data: Unacceptable
req.ra=02; // Questions: 2
req.cd = 00;
req.rcode = 00;
req.q_count = 00;
req.aa = 00;
if (sendto(sd, &req, sizeof(req), 00, (struct sockaddr*)&broadcastAddr, sizeof broadcastAddr)) {
NSLog(@"%s",strerror(errno));
}
close(sd);
最佳答案
首先 - 你怎么知道你的 iPad 没有看到 Bonjour 设备?除非它在非常早期的 iOS 版本上,否则它应该能够。
其次 - Bonjour 查询(通常)通过 DNS 请求 PTR 记录完成,而不是 ICMP。据我所知,无法获取网络上所有 Bonjour 设备的列表。因此您可以请求您感兴趣的服务,或者查询 _services._dns-sd._udp.local 以获得服务列表,然后查询每个服务。
无论哪种方式,您的数据包都需要一些问题信息。谷歌 DNS 数据包结构,这里是 PTR 请求的快速指南 --
id - 2 个字节,始终为零 标志 - 2 个字节,请求为零 问题计数 - 2 个字节,在本例中为 1 答案计数 - 2 个字节,零 权限计数 - 2 个字节,零 附加计数 - 2 个字节,零
接下来是你的问题 - 名称(例如 _airport._tcp.local)- 采用 3www6google3com0 格式 类型 - 2 个字节,12 个用于 PTR 类型 类 - 2 个字节,1 个用于互联网类
应该这样做。
但是请注意,在你解决这个问题之前,看看你是否可以绑定(bind)()到端口 5353。它不会让我这样做,说地址正在使用中。我想那些将 MDNS 响应器移植到 iOS 的人忘记了在他们的套接字上设置“重用地址”选项。到此为止。谢谢大家。
关于ios - 使用 Objective C 套接字发送 MDNS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615640/