2009-11-20 4 views
0

J'ai un périphérique FPGA avec lequel mon code doit parler. Le protocole est le suivant:Socles généraux Question de programmation UDP

J'envoie un seul octet non nul (UDP) pour activer une fonction. La carte FPGA commence alors à cracher des données sur le port à partir duquel j'ai envoyé.

Voyez-vous mon dilemme? Je sais quel port j'ai envoyé le message -, mais je ne sais pas de quel port je envoyé (est ce port ne sont généralement pas choisi automatiquement par le système d'exploitation?).

Ma meilleure estimation pour ce que je suis censé faire est de créer un socket avec l'IP de destination et le numéro de port, puis de réutiliser le socket pour la réception. Si je le fais, sera-t-il déjà configuré pour écouter sur le port d'où j'ai envoyé le message original?

Aussi, pour votre information, les variations de ce code seront écrites en Python et C#. Je peux rechercher des API spécifiques car les deux suivent le modèle de socket BSD.

+0

J'ai trouvé quelques bonnes informations dans un livre qui a effacé cette question pour moi. Si je peux retrouver le paragraphe, je l'ajouterai comme commentaire. Essentiellement, cela a confirmé mes soupçons. 1) Vous ne pouvez pas spécifier le port * de * que vous souhaitez envoyer. 2) Il n'est pas nécessaire de lier lors de l'utilisation de UDP. Après avoir utilisé sendto(), le socket peut être réutilisé pour recevoir des données sur le port * de * auquel la première requête a été envoyée. Il me semble étrange que ce comportement n'ait pas été rendu évident par les multiples documents que j'ai lus. Je vais voir si je peux retrouver cette référence. – Nate

Répondre

2

C'est exactement ce que connect(2) et getsockname(2) sont pour. En bonus pour connecter la socket UDP vous n'aurez pas à spécifier l'adresse/port de destination sur chaque envoi, vous pourrez découvrir le port de destination indisponible (la réponse ICMP de la cible se manifestera comme une erreur sur l'envoi suivant au lieu d'être drop), et votre OS n'aura pas à implicitement connecter et déconnecter le socket UDP sur chaque envoi en sauvegardant quelques cycles.

+0

C'est vrai. Vous n'avez pas besoin de 'bind()' - le port aléatoire que le système d'exploitation vous a donné sera correct (et non, vous n'avez rien de spécial à faire pour que le socket UDP écoute les paquets entrants). "connecter" c'est une bonne idée, cependant. – caf

0

vous pouvez bind le socket pour obtenir le port désiré. Le seul problème avec cela est que vous ne serez pas capable d'exécuter plus d'une instance de votre programme à la fois sur un ordinateur.

+0

Eh bien, vous pouvez toujours lier à un autre port. L'important est que vous gardiez une trace du port auquel vous vous liez. – futureelite7

+0

@ futurelite7: ouais ma remarque si utilisait un port défini. comme toujours pareil. – RageZ

1

Vous pouvez bind une prise à un port spécifique, vérifiez man bind

0

Vous utilisez UDP pour envoyer/recevoir des données. Il suffit de créer un nouveau socket UDP et de lier à l'interface/port souhaité. Ensuite, demandez à votre programme FPGA d'envoyer les paquets UDP au port auquel vous vous êtes lié. UDP ne vous oblige pas à écouter/configurer les connexions. (uniquement requis avec TCP)