11
votes

Relialisation à une adresse IP spécifique et à un port pour recevoir des données UDP

J'essaie de recevoir des données UDP diffusées à l'adresse réseau 192.168.103.255 Port 3000 par PlayCap ( http: // www .Signal11.us / OSS / PlayCap / ). J'ai des problèmes liés à cette adresse et à cette adresse. Voici mon code Java: xxx pré>

Ceci renvoie l'erreur: p>

gcc a.c -lws2_32


2 commentaires

Quelles sont les erreurs Win32? Pourquoi IP statique?


pourquoi vous disiez "diffusion" puis ip statique ??


3 Réponses :


3
votes

Vous ne liez pas l'adresse de diffusion pour recevoir des paquets de diffusion. Il suffit de se lier au port et à l'adresse inaddr_any (désolé, je ne sais pas comment exprimer cela en Java) et vous obtiendrez des paquets à ce port de l'adresse de diffusion.


3 commentaires

@Kirillkobelev: Je pense que "Écouter un port / adresse" est compris comme contraignant à une adresse particulière, mais j'ai clarifié le libellé.


J'ai remplacé les 4 lignes attribuant l'adresse du serveur avec juste "server.sin_addr.s_addr = htonl (inaddr_any);". J'ai également ajouté des sections aux deux codes pour recevoir des données (édité mon OP). Maintenant, mon code C se lie avec succès 0.0.0.0h3000 (vérifié avec netstat), mais lorsque j'exécute PlayCap pour lire les données de retour, rien n'est reçu. Mon code de réception a-t-il l'air ok?


Pour une référence future, ce qui a finalement résolu mon problème définissant mon adresse IP statique à quelque chose dans la gamme de 192.168.103.xxx. Étant donné que les données étaient diffusées au 192.168.103.255, je ne pouvais pas le recevoir à moins que mon IP n'était dans cette gamme. Merci de votre aide.



13
votes

Essayez ceci pour votre code Java à la place:

public static void main(String[] args) {
    try {
        DatagramSocket s = new DatagramSocket(null);
        InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
        s.bind(address);

    } catch (Exception e) {
        e.printStackTrace();
    }
}


14 commentaires

Obtenir cette erreur: java.net.bindexception: impossible d'attribuer l'adresse demandée: Impossible de se lier à java.net.dualstackplaindatagramSocketMpl.socketbind (méthode natif) sur java.net.dualstackplaindatagramsocketimpl.bind0 (source inconnue) sur java.net.abstractplaindatagramSocketImpl.bind ( Source inconnue) à java.net.datagramsocket.bind (source inconnue) au runner.main (runner.java:11)


@ AJLITZAU13: Ma réponse explique pourquoi c'est.


Essayez de lier votre interface par défaut, d'éliminer les problèmes IPv6 (supprimer l'adresse Internet et utilisez simplement le port).


@BenJackson - Votre réponse ne fournit pas d'explication de l'erreur que l'OP rencontre, désolé.


@Proception: Si je passe 3000 dans le constructeur de datagramSocket et éliminez les deux lignes après cela, il se lie à 0.0.0.0h3000 (vérifié avec netstat), mais lorsque je joue les données avec PlayCap, rien n'est reçu (j'ai édité mon code Java d'origine pour recevoir des données après la liaison.)


Si vous pouvez vous lier sans l'adresse IP spécifiée, vous vous transmettez une adresse IPv4 incorrecte ou votre interface est configurée pour IPv6. Qu'est-ce que ipconfig / A rapport pour toutes vos interfaces réseau?


Qu'entendez-vous par une adresse IP incorrecte? Voici ma sortie ipconfig: web.fr.illinois.edu/~litzau1/ipconfig. txt


Essayez Binding to Fe80 :: CCDD: 1D08: E297: 2884% 10, même port.


Cela donne le même résultat qu'avant - 0.0.0.0h0h3000 est lié, mais aucune donnée (quelle diffusion de lecture diffusion) est reçue.


Sur, le problème de liaison est résolu, veuillez poster le problème de réception comme une question distincte.


Ça ira. Merci pour l'aide.


Si je ne spécifie pas l'adresse IP 192.168.103.255 n'importe où dans mon code? Comme c'est le cas, je spécifie uniquement le port 3000 avec votre solution.


Comment les données sont-elles envoyées de PlayCap? Vous voudrez peut-être exécuter une capture de paquets pour le savoir. De plus, si ma réponse a aidé à résoudre votre problème d'origine, n'hésitez pas à upérer et à l'accepter.


Pour une référence future, ce qui a finalement résolu mon problème définissant mon adresse IP statique à quelque chose dans la gamme de 192.168.103.xxx. Étant donné que les données étaient diffusées au 192.168.103.255, je ne pouvais pas le recevoir à moins que mon IP n'était dans cette gamme. Merci de votre aide.



0
votes

IT apparaît que Le constructeur de datagramme prend le numéro de port pour se lier. J'espère que cela a aidé ...


0 commentaires