【问题标题】:Receiving multiple sendto() from servers从服务器接收多个 sendto()
【发布时间】: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));
    }

【问题讨论】:

    标签: visual-c++ winsock


    【解决方案1】:

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

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

    【讨论】:

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