接收来自N个客户端的响应,以响应UDP上的广播请求

puf*_*der 6 c c++ sockets udp broadcast

我正在为特定类型的网络多媒体设备实现一种IP查找器.我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节.

该设备有自己的设备发现方式.

它的工作原理如下:客户端通过UDP通过LAN发送广播请求.
目标端口号是固定的.
作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息.

我正在使用sendto()广播UDP请求消息.

现在我的问题是我不知道有多少设备(ieservers)会响应请求.

我需要多少次调用recvfrom()?
我什么时候才能知道我已经处理了所有设备的响应?
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
有没有更好的(或者如果我错在这里是正确的)完成相同的方式?

我正在用C/C++编程,计划为Windows和Linux编写代码.
提前谢谢了.

编辑:所以在这里的所有网络编程向导的帮助下,我找到了解决我的问题的方法:)
select()对我来说就是这样的事情...非常
感谢所有花时间帮忙的人我

jsc*_*ier 2

我需要调用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);
Run Code Online (Sandbox Code Playgroud)

或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?

recvfrom()通常与无连接模式套接字一起使用,因为它允许应用程序检索接收到的数据的源地址。