47 votes

Pouvez-vous lier () et connecter () les deux extrémités d'une connexion UDP

J'écris un système de file d'attente de messages point à point, et il doit pouvoir fonctionner sur UDP. Je pourrais choisir arbitrairement un côté ou l'autre pour être le "serveur", mais cela ne semble pas tout à fait correct puisque les deux extrémités envoient et reçoivent le même type de données de l'autre.

Est-il possible de lier () et de connecter () les deux extrémités afin qu'elles envoient/reçoivent uniquement l'une de l'autre ? Cela semble être une façon bien symétrique de le faire.

6voto

Geoff Reedy Points 16508

Vraiment la clé est connect() :

Si la socket sockfd est de type SOCK_DGRAM alors addr est l'adresse à laquelle les datagrammes sont envoyés par défaut, et la seule adresse à partir de laquelle les datagrammes sont reçus.

1voto

Jack Points 11

Il y a un problème dans ton code :

 memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;        //UDP communication

/*For destination address*/
if ((rv = getaddrinfo(argv[1], argv[2], &hints, &dstinfo)) 

En utilisant uniquement AF_UNSPEC et SOCK_DGRAM, vous obtenez une liste de toutes les adresses possibles. Ainsi, lorsque vous appelez socket, l'adresse que vous utilisez peut ne pas être celle que vous attendez UDP. Tu devrais utiliser

 hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_PASSIVE;

au lieu de cela, assurez-vous que l'addrinfo que vous récupérez est ce que vous vouliez.

En d'autres termes, le socket que vous avez créé n'est peut-être pas un socket UDP, et c'est la raison pour laquelle cela ne fonctionne pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X