2017-07-28 1 views
0

J'apprends les sockets. J'écris un serveur UDP simple, à travers lequel de petits messages sont envoyés. Tous les clients actifs envoient des messages "keepalive" toutes les trois minutes afin que le serveur puisse voir quels clients sont en ligne.С ++ - Serveur UDP avec plusieurs clients

Ces messages sont reçus dans le flux

fonction Stream:

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

Mais comment mettre en œuvre, par exemple, la transmission de messages à tous les clients ou un particulier, si la prise est déjà "occupé". Besoin de créer un nouveau socket pour envoyer des messages? (Sur le serveur et sur le client)? Et si les clients sont derrière NAT?

La même question est aussi du côté du client (parce que keepalive est sortie au fil, mais pour résoudre ce problème, l'autre est résolu aussi)

Répondre

0

Une fois le serveur reçoit le message keepalive, vous avez déjà obtenu l'adresse du client dans cliAddr. Ensuite, vous pouvez utiliser la fonction sendto pour envoyer quelque chose au client. Si vous voulez utiliser d'autres prises, vous pouvez le faire. Et si les clients sont derrière NAT? Peu importe. Si le serveur a une adresse WAN, le routeur convertira l'adresse IP et le port du LAN en adresse et port WAN. L'adresse du client que vous avez dans le serveur est une adresse et un port WAN. WAN (adresse et port) - carte - LAN (adresse et port).

Dans le client, je suggère que vous fassiez un thread pour recv message et les traiter (inclure un message keepalive ou un autre type).

+0

Je ne veux pas envoyer de réponse tout de suite. Je veux le faire à tout moment, mais mon socket sera occupé en attente de keep-alive. –

+0

Sur le serveur, si vous ne souhaitez pas bloquer le recvfrom, vous pouvez créer un autre thread pour traiter l'événement ou le message que vous avez reçu. Dans les autres fils, vous pouvez décider d'envoyer à tout moment. – user8380302