我正在为特定类型的网络多媒体设备实现一种 IP 查找器。
我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息。
设备有自己的设备发现方式。
其工作原理如下:
客户端通过 UDP 通过 LAN 发送广播请求。
目的端口号是固定的。
作为答复,LAN 中所有理解该请求格式的服务器都将响应该请求并提供有关其自身的信息。
我正在使用 sendto() 广播 UDP 请求消息。
现在我的问题是我不知道有多少设备(即服务器)将响应该请求。
我需要调用recvfrom()多少次?
我什么时候才能知道我已经处理了所有设备的响应?
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
有没有更好的(或者正确的,如果我在这里错了)方法来完成同样的任务?
我正在使用 C/C++ 进行编程,计划为 Windows 和 Linux 编写代码。
提前谢谢了。
编辑:
因此,在所有网络编程向导的帮助下,我找到了问题的解决方案:)
select() 正是适合我的东西......
非常感谢大家抽出时间来帮助我
我需要调用recvfrom()多少次?
我什么时候才能知道我已经处理了所有设备/服务器的响应?
如果您不知道设备/服务器的数量,您就无法知道需要调用多少次recvfrom()
或者当您处理完所有回复后。
您可能会考虑使用select()
循环(直到超时)并调用recvfrom()
当数据可供读取时。这可能在主线程或单独的线程中。
如果数据到达的速度快于处理的速度,您将丢失数据报。这很大程度上取决于接收数据后解析和存储数据的速度。如果处理数据是密集型操作,则可能需要在单独的线程中进行处理或存储数据直到接收循环超时,然后继续处理它。
由于 UDP 不可靠,循环重播几次应该有助于解决一些丢失问题,并且处理应该解决重复问题。
以下伪代码是我解决该问题的方法:
/* get socket to receive responses */
sd = socket( ... );
do
{
/* set receive timeout */
timeout.tv_sec = 5;
/* broadcast request */
sendto( ... );
/* wait for responses (or timeout) */
while(select(sd+1, &readfds;, NULL, NULL, &timeout;) > 0)
{
/* receive the response */
recvfrom( ... );
/* process the response (or queue for another thread / later processing) */
...
/* reset receive timeout */
timeout.tv_sec = 5;
}
/* process any response queued for later (and not another thread) */
} while (necessary);
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
recvfrom()
通常与无连接模式套接字一起使用,因为它允许应用程序检索接收到的数据的源地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)