2017-07-28 70 views
0

我正在學習套接字。我正在寫一個簡單的UDP服務器,通過它發送小消息。所有活動客戶端每三分鐘發送一次「保持活動」消息,以便服務器可以查看哪些客戶端在線。С++ - 具有多個客戶端的UDP服務器

這些消息流中收到

流功能:

void keepAlive(SOCKET udp) 
{ 
int len=0; 
while(true) 
{ 
int len=recvfrom(udp,requestBuffer,maxMessage,0,(sockaddr*)&cliAddr,&cliAddrSize) 
// Actions with the received message 
} 
} 

但如何實現,例如,消息發送給所有的客戶端或一個特定的傳輸,如果套接字已「忙」。需要創建一個新的套接字來發送消息? (在服務器和客戶端上)?如果客戶端在NAT後面?

同樣的問題也對客戶端(因爲存活取出的線程,但解決這個問題的時候,另一種是被解決過)

回答

0

服務器後已收到保持活動消息,您在cliAddr中獲得了客戶端地址。 然後你可以使用sendto函數發送一些東西給客戶端。 如果你想使用其他套接字,你可以做到。 如果客戶端在NAT後面? 沒關係。如果服務器獲得了WAN地址,則路由器會將LAN中的IP地址和端口轉換爲WAN地址和端口。您在服務器中獲取的客戶端地址是WAN地址和端口。 WAN(地址和端口) - 地圖 - LAN(地址和端口)。

在客戶端,我建議你做一個線程recv消息並處理它們(包括keepalive消息或其他類型)。

+0

我不想立即發送答案。我想隨時做到這一點,但我的套接字將忙於等待保持活動狀態。 –

+0

在服務器中,如果您不想阻止recvfrom,則可以創建另一個線程來處理事件或您收到的消息。在其他線程中,您可以隨時決定發送。 – user8380302