从服务器接收多个 sendto()

Posted

技术标签:

【中文标题】从服务器接收多个 sendto()【英文标题】:Receiving multiple sendto() from servers 【发布时间】:2014-10-07 16:26:47 【问题描述】:

我的客户端正在向子网上的所有服务器发送 UDP 广播。每个服务器都会回复客户端,以便客户端可以获取/存储服务器的 IP 地址。并非每次所有服务器都会收到消息(可能是因为 UDP?)。当找到服务器的新IP地址时,最好的方法是增加一个广播计数器吗?

另一个问题目前在客户端,一次只能收到一条消息。是否可以同时接收多条消息?

这是我的客户端代码:

    if (recvfrom(Socket, receiveBuffer, BUFLEN, 0, (struct sockaddr *) &connectedSocket, &length) == SOCKET_ERROR)
    
        printf("\nrecvfrom() failed with error code : %d" , WSAGetLastError());
        closesocket(Socket);
        WSACleanup();
        exit(EXIT_FAILURE);
     else 
        printf("\nServer Says : ");
        printf("\n\nI am from %s:%d\n", inet_ntoa(connectedSocket.sin_addr), ntohs(connectedSocket.sin_port));
    

【问题讨论】:

【参考方案1】:

发送广播后,启动计时器并让它运行 5-30 秒。在此期间,处理您收到的任何回复。当计时器结束时,停止处理任何回复,如果您碰巧收到它们,请丢弃它们。

不,UDP 套接字不能一次为您提供多个数据报,您必须单独读取它们。

【讨论】:

我要做的基本上是查询本地网络上的所有机器(运行服务器)。由于我一次只能收到 1 条消息,您如何看待检查它是否是新的 ip 地址,如果是,增加计数器(最初是 5 可以说)做 5?更多广播 我认为根本不需要使用计数器或多个广播。发送一个广播。如果您看到一个新 IP,请将其添加到您的列表中并继续。给自己一些时间来接收回复,它们可能不是即时的。仅仅因为您一次不能收到多条消息并不意味着 SOCKET 不能。它有一个内部接收缓冲区是有原因的。只要您的阅读速度足够快,缓冲区不会被填满,您就不会丢失回复。 只需将上面的 if (recvfrom..) 块放入无限循环中进行测试,我确实得到了所有回复!非常感谢您提供有关缓冲区的帮助和信息。

以上是关于从服务器接收多个 sendto()的主要内容,如果未能解决你的问题,请参考以下文章

通过 C 中的套接字传递结构

UDP服务器是做啥用的?

sendto 中的参数无效

发送到:无效参数错误

从 Firebase 接收多个重复推送通知

实现UDP高效接收/响应