Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 从服务器接收多个sendto()_Visual C++_Winsock - Fatal编程技术网

Visual c++ 从服务器接收多个sendto()

Visual c++ 从服务器接收多个sendto(),visual-c++,winsock,Visual C++,Winsock,我的客户端正在向子网上的所有服务器发送UDP广播。每个服务器都会回复客户机,以便客户机可以获取/存储服务器的ip地址。并非所有服务器每次都会收到消息(可能是因为UDP?)。解决这一问题的最佳方法是在发现服务器的新ip地址时增加要广播的计数器吗 另一个问题目前在客户端,一次只能收到一条消息。是否可以同时接收多条消息 这是我的客户代码: if (recvfrom(Socket, receiveBuffer, BUFLEN, 0, (struct sockaddr *) &connec

我的客户端正在向子网上的所有服务器发送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));
    }

发送广播后,启动计时器并让其运行5-30秒。在这段时间内,处理您收到的任何回复。当计时器过期时,停止处理更多的回复,如果您碰巧收到回复,就丢弃它们


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

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