puf*_*der 6 c c++ sockets udp broadcast
我正在为特定类型的网络多媒体设备实现一种IP查找器.我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节.
该设备有自己的设备发现方式.
它的工作原理如下:客户端通过UDP通过LAN发送广播请求.
目标端口号是固定的.
作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息.
我正在使用sendto()广播UDP请求消息.
现在我的问题是我不知道有多少设备(ieservers)会响应请求.
我需要多少次调用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);
Run Code Online (Sandbox Code Playgroud)
或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗?
recvfrom()通常与无连接模式套接字一起使用,因为它允许应用程序检索接收到的数据的源地址。
| 归档时间: |
|
| 查看次数: |
2489 次 |
| 最近记录: |