菜鸟教程小白 发表于 2022-12-13 05:57:22

ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机


                                            <p><p>我正在尝试为我的 iPhone 构建一个小程序,它可以检测本地网络上的设备(尤其是 IP 摄像机)。我知道其中一些支持协议(protocol),例如 UPnP,我也一直在尝试,但我现在想完全自己实现 iPhone 和相机之间的通信,而不依赖于库。</p>

<p>我的方法是将广播消息发送到本地网络并解析收到的响应。例如,为了检测本地网络上的 UPnP 设备,广播的消息需要具有以下内容:</p>

<pre><code>M-SEARCH * HTTP/1.1\r\nHOST:255.255.255.255:1900\r\nMAN:\&#34;ssdp:discover\&#34;\r\nST:ssdp:all\r\nMX:1\r\n\r\n
</code></pre>

<p>我对 C 中的网络编程有点熟悉,所以我想用 C 编写通信代码,并在以后集成到我的 Objective-C 中。 </p>

<p>我目前正在做以下事情:</p>

<pre><code>// Create socket
int sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

// Enable broadcast messaging
int broadcastEnable = 1;
int ret = setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &amp;broadcastEnable, sizeof(broadcastEnable));

// Configure the port and ip we want to send to
struct sockaddr_in broadcastAddr; // Make an endpoint
memset(&amp;broadcastAddr, 0, sizeof broadcastAddr);
broadcastAddr.sin_family = AF_INET;
inet_pton(AF_INET, &#34;255.255.255.255&#34;, &amp;broadcastAddr.sin_addr); // Set the broadcast IP address
broadcastAddr.sin_port = htons(1900); // Set port 1900

// Create the broadcast UPnP request
char *request = &#34;M-SEARCH * HTTP/1.1\r\nHOST:255.255.255.255:1900\r\nMAN:\&#34;ssdp:discover\&#34;\r\nST:ssdp:all\r\nMX:1\r\n\r\n&#34;;

// start the broadcast
success = sendto(sd, request, strlen(request), 0, (struct sockaddr*)&amp;broadcastAddr, sizeof broadcastAddr);
</code></pre>

<p>现在,我被困在这一点上,因为我不知道如何处理任何答案。来自 UPnP 设备的回复会来自同一个套接字吗?我相信它应该能够使用 recvfrom() 的 recv() 接收传入的回复,但我不确定如何准确地实现它们。我必须创建一个新的套接字还是可以只创建一个现有的?套接字是否必须使用 bind() 绑定(bind)?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>首先,您正在尝试发送 SSDP 数据包以进行服务发现。所以你应该将此数据包发送到组播地址 239.255.255.250 而不是 255.255.255.255。</p>

<p>除此之外,您可以在同一个套接字上接收对发现请求的响应。只需在此套接字上调用 recv() 函数即可。</p>

<p>此外,我希望您使用的是 Mac OS X(因为您正在为 iOS 开发),因此您已经安装了 Python。只需打开终端并输入 <strong>python</strong> 并复制粘贴以下 python 代码,</p>

<pre><code>import sys
import socket

SSDP_ADDR = &#34;239.255.255.250&#34;;
SSDP_PORT = 1900;
SSDP_MX = 1;
SSDP_ST = &#34;ssdp:all&#34;;

ssdpRequest = &#34;M-SEARCH * HTTP/1.1\r\n&#34; + \
                &#34;HOST: %s:%d\r\n&#34; % (SSDP_ADDR, SSDP_PORT) + \
                &#34;MAN: \&#34;ssdp:discover\&#34;\r\n&#34; + \
                &#34;MX: %d\r\n&#34; % (SSDP_MX, ) + \
                &#34;ST: %s\r\n&#34; % (SSDP_ST, ) + &#34;\r\n&#34;;

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(ssdpRequest, (SSDP_ADDR, SSDP_PORT))
print sock.recv(1000)
</code></pre>

<p>此代码将发送一个发现数据包并打印它从网络接收到的第一个响应。我只是分享此代码,因为即使您不了解 python,您也可以轻松地对其进行测试并理解代码。当然,这可以很容易地翻译成 C。</p>

<p>希望对你有帮助。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21138530/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21138530/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机