Le serveur écoute effectivement sur un «port bien connu», puis commute les communications suivantes vers un port dédié par client. Exiger que le client envoie au port + 1 est un peu étrange
Client 192.168.0.1 - port 12121 ------------------------> Server 192.168.0.2 - port 5050
Client 192.168.0.1 - port 12121 <------------------------ Server 192.168.0.2 - port 23232
Client 192.168.0.1 - port 12121 ------------------------> Server 192.168.0.2 - port 23232 + 1
<------------------------ Server 192.168.0.2 - port 23232
------------------------> Server 192.168.0.2 - port 23232 + 1
Le serveur ne peut-être cela pour que cela ne doit pas démultiplexer les données client entrantes basées sur une adresse/port du client. Le faire de cette façon est un peu plus efficace (en général) et présente également certains avantages, en fonction de la conception du serveur, car sur le serveur il y a une socket dédiée, ce qui signifie que s'ils font des E/S superposées alors le socket reste le même pour toute la période de communication avec vous, ce qui peut rendre plus facile et plus efficace l'association de données avec le socket (de cette façon ils peuvent probablement éviter les recherches ou le verrouillage pour traiter chaque datagramme). Quoi qu'il en soit, assez de cela (voir here, si vous voulez savoir pourquoi I le faire de cette façon).
De votre point de vue en tant que client (et je suppose que les prises async ici), vous devez d'abord Bind()
votre prise locale (il suffit d'utiliser INADDR_ANY
et 0
pour permettre à l'OS de choisir le port pour vous) émettre alors un RecvFrom()
sur le socket (il n'y a donc pas de course entre vous envoyant des données au serveur sur cette socket et il vous renvoie des données avant d'émettre un recv). Ensuite, émettez un SendTo()
au «port bien connu» du serveur. Le serveur vous renverra alors des données et votre RecvFrom()
vous renverra les données et l'adresse que le serveur vous a envoyées. Vous pouvez ensuite prendre cette adresse, en ajouter une au port, stocker cette adresse et ensuite émettre SendTo()
s à cette nouvelle adresse d'envoi tout en continuant à émettre RecvFrom()
s pour lire les données du serveur; ou vous pouvez faire quelque chose de malin avec Connect()
pour lier l'extrémité distante du socket à l'adresse 'send to address' du serveur et simplement utiliser Write()
et RecvFrom()
à partir de là.