2014-10-07 60 views
0

我的客户端正在向该子网上的所有服务器发送UDP广播。每台服务器都会回复客户端,以便客户端可以获取/存储服务器的IP地址。并非所有服务器都会收到消息(可能是因为UDP?)。解决这个问题的最佳方法是在找到服务器的新IP地址时增加计数器进行广播。从服务器接收多个sendto()

另一个问题是目前在客户端,它一次只能得到1条消息。是否有可能同时收到多封邮件?

这是我的客户端代码:

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)); 
    } 

回答

0

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

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

+0

我想要做的是基本上查询本地网络上的所有机器(运行服务器)。由于我一次只能收到1条消息,你认为如何检查它是否是新的IP地址,如果是这样,增量计数器(最初5让我们说)做5?更多广播 – John 2014-10-08 13:32:55

+0

我没有看到需要使用计数器或多个广播。发送一个广播。如果您看到新的IP,请将其添加到您的列表中并继续。给自己时间来接收答复,他们可能不是即时的。仅仅因为你一次收不到多条消息并不意味着SOCKET不能。它有一个内部接收缓冲区的原因。只要你的阅读速度足够快,缓冲区不会填满,你就不会丢失答复。 – 2014-10-08 14:18:39

+0

只要把上面的if(recvfrom ..)块放在一个无限的for循环中测试,我确实得到了所有的回复!非常感谢您的帮助和有关缓冲区的信息。 – John 2014-10-08 14:36:27