2014-10-07 80 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

相關問題