IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Impossible d'initialiser un socket UDP


Sujet :

Entrée/Sortie Java

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut Impossible d'initialiser un socket UDP
    Salut à tous

    J'ai un programme en C qui envoie un tableau d'entier via une liaison UDP. De l'autre coté j'essaye d'écrire un thread qui reçois ces données. Lorsque j'initialise mon socket j'ai l'exception suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    java.net.BindException: Address already in use: Cannot bind
    	at java.net.PlainDatagramSocketImpl.bind0(Native Method)
    	at java.net.PlainDatagramSocketImpl.bind(Unknown Source)
    	at java.net.DatagramSocket.bind(Unknown Source)
    	at java.net.DatagramSocket.<init>(Unknown Source)
    	at java.net.DatagramSocket.<init>(Unknown Source)
    	at java.net.DatagramSocket.<init>(Unknown Source)
    	at communication.AcqCourbe.run(AcqCourbe.java:31)
    Voici le thread Java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    public class AcqCourbe extends Thread {
    
    	private DatagramSocket m_UDPSocket = null;
    	private PageCameras m_PgCamera = null;
    	private boolean m_InitOK=false;
    
    	public AcqCourbe(PageCameras Pg) {
    		m_PgCamera = Pg;
    	}
    
    	public void run() {
    		byte[] buff = new byte[4 * 440];
    		DatagramPacket packet = new DatagramPacket(buff, buff.length);
    		try {
    			m_UDPSocket = new DatagramSocket(35001);//<-Exception
    			m_UDPSocket.setSoTimeout(200);
    			m_InitOK=true;
    
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		while (m_InitOK) {
    
    			try {
    				m_UDPSocket.receive(packet);
    				ByteBuffer buf = ByteBuffer.wrap(packet.getData());
    				buf.order(ByteOrder.LITTLE_ENDIAN);
    				IntBuffer val = buf.asIntBuffer();
    				int nb = val.capacity();
    				int recv[] = new int[nb];
    				for (int i = 0; i < nb; recv[i] = val.get(i), i++);
    				m_PgCamera.AfficheCourbe(1, nb, recv);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    }
    Voici le code C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    DWORD WINAPI Simu(LPVOID Param)
    {
    #define BUFFSIZE 440
    	int nbcar,Err;
    	int n,ph;
     
     
    	int buffer[BUFFSIZE];
     
    	SOCKET sock;
    	SOCKADDR_IN elec={0};
    	struct hostent *hostinfo=NULL;	
    	int Telec=sizeof(elec);
     
    	hostinfo=gethostbyname("localhost");
     
    	elec.sin_addr=*(IN_ADDR*) hostinfo->h_addr;
    	elec.sin_port=htons(35001);
    	elec.sin_family=AF_INET;
     
     
     
    	sock=socket(AF_INET,SOCK_DGRAM,0);
     
    	bind(sock,(struct sockaddr*)&elec,Telec);
     
    	ph=0;	
    	while(sock!=INVALID_SOCKET)
    	{
     		for(n=0;n<BUFFSIZE;n++)
    		{
    			double x=100*sin(3.1415926535897/50*(double)(n+ph));
    			buffer[n]=(int)x;
    		}
    		ph++;
    		if (ph>100)
    			ph=0;
     
    		nbcar=sendto(sock,(char*)buffer,BUFFSIZE*sizeof(int),0,(SOCKADDR*)&elec,Telec);
     
    		if(nbcar==-1)
    		{
    			Err=WSAGetLastError();
    		}
    		Sleep(50);
    	}
    	return 0;
    }
    Normalement le code C est en exécution avant que le code Java ne s'exécute. Si on fait l'inverse ça marche mais dans mon cas ce n'est pas possible pour des raisons autres.

    Si quelqu'un a une idée d'où vient le problème?
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 612
    Points
    21 612
    Par défaut
    Ben, le message d'erreur est clair. Pour une raison ou pour une autre, le port UDP 35001 est déjà pris quand tu fais ton test. Un port UDP ne peut être utilisé que par un seul programme à la fois sur la même machine.

    J'ignore pourquoi le port est déjà pris quand C est démarré d'abord, et libre quand Java est démarré d'abord, mais toi tu le sais peut-être.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ben, le message d'erreur est clair. Pour une raison ou pour une autre, le port UDP 35001 est déjà pris quand tu fais ton test.
    J'avais bien compris le sens du message ce que j'aimerais bien savoir c'est pourquoi java considère que le port n'est pas libre.

    Citation Envoyé par thelvin Voir le message
    Un port UDP ne peut être utilisé que par un seul programme à la fois sur la même machine.
    Ca veut dire qu'il est impossible de faire de l'UDP sur une machine unique????
    J'ai des doutes car ça marche en C j'ai fait le test pour vérifier que mon émetteur fonctionnait bien.

    Citation Envoyé par thelvin Voir le message
    J'ignore pourquoi le port est déjà pris quand C est démarré d'abord, et libre quand Java est démarré d'abord, mais toi tu le sais peut-être
    Non
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 612
    Points
    21 612
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    J'avais bien compris le sens du message ce que j'aimerais bien savoir c'est pourquoi java considère que le port n'est pas libre.
    En général parce qu'il ne l'est pas. Mais ça peut aussi être une restriction d'un autre genre, du type "pas le droit de réserver les ports dans telle ou telle plage."

    Citation Envoyé par Gouyon Voir le message
    Ca veut dire qu'il est impossible de faire de l'UDP sur une machine unique????
    Disons que deux programmes sur la même machine qui communiquent avec le même port UDP, ce n'est pas censé marcher. C'est prévu pour être utilisé différemment.

    C'est logique, d'ailleurs : comment la pile réseau est-elle censée deviner quel programme doit recevoir quoi, dans une telle condition ?...

    Citation Envoyé par Gouyon Voir le message
    J'ai des doutes car ça marche en C j'ai fait le test pour vérifier que mon émetteur fonctionnait bien.
    ... Mais dans certains cas, par exemple avec un seul émetteur et un seul récepteur, et si personne ne prend la peine de vérifier si le port est déjà pris, ça peut marcher. Je me serais attendu à ce que l'OS, en ces temps modernes, ne soit pas d'accord avec ça. Mais bon...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par thelvin Voir le message
    En général parce qu'il ne l'est pas. Mais ça peut aussi être une restriction d'un autre genre, du type "pas le droit de réserver les ports dans telle ou telle plage."
    J'y ai bien pensé c'est pourquoi j'ai évité les ports en dessous de 10000

    Citation Envoyé par thelvin Voir le message
    Disons que deux programmes sur la même machine qui communiquent avec le même port UDP, ce n'est pas censé marcher. C'est prévu pour être utilisé différemment.

    C'est logique, d'ailleurs : comment la pile réseau est-elle censée deviner quel programme doit recevoir quoi, dans une telle condition ?...
    Non ce n'est pas logique. Il y a un émetteur et des receveurs s'ils recoivent tant mieux sinon tant pis c'est pas grave. Au contraire de TCP qui lui s'assure que tout ce qui a été envoyé est bien reçu.
    De plus dans l'initialisation du socket on indique uniquement le port et pas d'adresse IP. Ce qui veut dire que le message peut venir de n'importe où ce qui inclus la machine émétrice.
    Enfin dans tout ce que j'ai pu lire sur UDP je n'ai jamais vu une telle restriction.
    Je vais faire le test en mettant le programme éméteur sur une autre machine et je verrais ce que ça donne.

    Mais je pense plutôt qu'il y a une option à modifier quelque part pour que ça fonctionne.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  2. Impossible d'initialiser le BDE
    Par teryen dans le forum Bases de données
    Réponses: 1
    Dernier message: 03/11/2005, 10h45
  3. [COM] Impossible d'initialiser la librairie COM
    Par Neilos dans le forum Windows
    Réponses: 2
    Dernier message: 07/08/2005, 17h28
  4. Réponses: 10
    Dernier message: 19/05/2004, 11h41
  5. Notion sur Socket UDP
    Par oxor3 dans le forum Développement
    Réponses: 3
    Dernier message: 05/04/2004, 00h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo