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

C Discussion :

Socket: envoyer un entier en java, le recevoir en c


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut Socket: envoyer un entier en java, le recevoir en c
    Bonjour,

    Je doit envoyer un entier à travers un socket, d'un server java vers un client en c. Mon problème est que le résultat est très instable. Si je lance ma requête 5 fois de suite, cela peut fonctionner 2 fois et m'afficher 3 messages d'erreurs. Voici mon code :

    Server :

    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
     
            void handleRequest() throws IOException {
    		myClientSocket = myServerSocket.accept();
    		try{
    			InputStream inputS = myClientSocket.getInputStream();
    			OutputStream outputS = myClientSocket.getOutputStream();
    			BufferedOutputStream bufferOut = new BufferedOutputStream(outputS);
    			dis = new DataInputStream(inputS);
    			dos = new DataOutputStream(outputS);
    			list();
    			dis.close();
    			dos.close();
    		} catch (IOException e) {
    			System.out.println(e.getMessage());
    		}
    		myClientSocket.close();
    	}
     
            public void list() throws IOException {
    		HashMap<Integer, HotelRoom> list;
    		list = hotel.getAvailableRooms();
    		Iterator it = list.keySet().iterator();
    		int key, tmp;
    		HotelRoom room;
    		while(it.hasNext()) {
    			key = (Integer) it.next();
    			room = list.get(key);
    			// write type
    			tmp = room.getType();
    			dos.writeInt(tmp);
    			// write nbRoom
    			tmp = room.getNbRooms();
    			dos.writeInt(tmp);
    			// write the price
    			tmp = room.getPrice();
    			dos.writeInt(tmp);
    		}
    	}
    Client :

    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
     
            for(i = 0; i < nbType; i++)
    	{
    		while(read(mySocket, &type, sizeof(int)) != sizeof(int))
    		{
    			printf("Error during the read 1\n");
    			exit(0);
    		}
    		while(read(mySocket, &nbRoom, sizeof(int)) != sizeof(int))
    		{
    			printf("Error during the read 2\n");
    			exit(0);
    		}
    		while(read(mySocket, &price, sizeof(int)) != sizeof(int))
    		{
    			printf("Error during the read 3\n");
    			exit(0);
    		}
    		printf("Type %d : %d rooms free for the price %d.\n", ntohl(type), ntohl(nbRoom), ntohl(price));
    	}
    Le code est assez volumineux, je n'ai mis que la partie où il y'à un échange à travers le socket.

    Je pense que l'erreur vient de la lecture en c. A chaque fois que je ne lit pas size(int), j'affiche un message et je fait un exit(). Si je ne fait pas cette exit(), l'entier lu peut être n'importe quoi.

    Savez vous comment faire pour que le read() fonctionne à chaque fois ?

    Merci.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kleveque Voir le message
    Bonjour,

    Je doit envoyer un entier à travers un socket, d'un server java vers un client en c. Mon problème est que le résultat est très instable. Si je lance ma requête 5 fois de suite, cela peut fonctionner 2 fois et m'afficher 3 messages d'erreurs. Voici mon code :

    Server :

    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
     
            void handleRequest() throws IOException {
    		myClientSocket = myServerSocket.accept();
    		try{
    			InputStream inputS = myClientSocket.getInputStream();
    			OutputStream outputS = myClientSocket.getOutputStream();
    			BufferedOutputStream bufferOut = new BufferedOutputStream(outputS);
    			dis = new DataInputStream(inputS);
    			dos = new DataOutputStream(outputS);
    			list();
    			dis.close();
    			dos.close();
    		} catch (IOException e) {
    			System.out.println(e.getMessage());
    		}
    		myClientSocket.close();
    	}
     
            public void list() throws IOException {
    		HashMap<Integer, HotelRoom> list;
    		list = hotel.getAvailableRooms();
    		Iterator it = list.keySet().iterator();
    		int key, tmp;
    		HotelRoom room;
    		while(it.hasNext()) {
    			key = (Integer) it.next();
    			room = list.get(key);
    			// write type
    			tmp = room.getType();
    			dos.writeInt(tmp);
    			// write nbRoom
    			tmp = room.getNbRooms();
    			dos.writeInt(tmp);
    			// write the price
    			tmp = room.getPrice();
    			dos.writeInt(tmp);
    		}
    	}
    Client :

    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
     
            for(i = 0; i < nbType; i++)
    	{
    		while(read(mySocket, &type, sizeof(int)) != sizeof(int))
    		{
    			printf("Error during the read 1\n");
    			exit(0);
    		}
    		while(read(mySocket, &nbRoom, sizeof(int)) != sizeof(int))
    		{
    			printf("Error during the read 2\n");
    			exit(0);
    		}
    		while(read(mySocket, &price, sizeof(int)) != sizeof(int))
    		{
    			printf("Error during the read 3\n");
    			exit(0);
    		}
    		printf("Type %d : %d rooms free for the price %d.\n", ntohl(type), ntohl(nbRoom), ntohl(price));
    	}
    Le code est assez volumineux, je n'ai mis que la partie où il y'à un échange à travers le socket.

    Je pense que l'erreur vient de la lecture en c. A chaque fois que je ne lit pas size(int), j'affiche un message et je fait un exit().

    Savez vous comment faire pour que le read() fonctionne à chaque fois ?

    Merci.
    Salut

    Déjà je ne pige pas pourquoi une boucle qui ne tourne qu'une fois. Ensuite, on ne sort jamais d'une fonction via exit(). C'est une façon de programmer "à la va vite" mais si c'est fait "à la va vite" ici alors il y a des chances que ce soit fait de la même façon ailleurs et être alors la cause de ton pb.
    De plus, il n'est pas anormal que la valeur renvoyée par read() correspondant au nombre d'octets lus soit inférieure au nombre d'octets demandés (si le flux est vide par exemple parce que ton serveur n'a pas eu le temps d'envoyer). Si vraiment on veut détecter une erreur de read(), il faut alors chercher -1 comme valeur renvoyée. Et même là, ce n'est pas forcément une erreur par exemple dans le cas de lecture non bloquante mais qu'il n'y a rien à lire. Dans ce cas, read() renvoie -1 mais errno contient la valeur EAGAIN et le programmeur peut alors redemander un read() un peu plus tard.
    Donc en fait, une vrai erreur de lecture c'est quand read() renvoie -1 et que errno n'est pas égal à EAGAIN.

    Enfin il peut être utile que tu affiches aussi strerror(errno) qui est le message d'erreur envoyé par le système quand ton read foire...

    Citation Envoyé par kleveque Voir le message
    Si je ne fait pas cette exit(), l'entier lu peut être n'importe quoi.
    Ben oui, ton entier n'ayant pas été modifié, il a toujours la valeur qu'il avait à sa création. Mais ce n'est pas en rajoutant un exit() que ça change quoi que ce soit à cet état de fait...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Envoyer un entier dans un socket
    Par julie75 dans le forum Réseau
    Réponses: 12
    Dernier message: 03/07/2008, 14h07
  2. Envoyer une entier dans une socket
    Par julie75 dans le forum Linux
    Réponses: 2
    Dernier message: 02/07/2008, 22h24
  3. [Socket] Chaine entiere a envoyer a un serveur Java
    Par n8ken dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/09/2006, 15h58
  4. [sockets]envoyer recevoir des msg
    Par Sirion dans le forum C++
    Réponses: 10
    Dernier message: 19/05/2005, 22h04
  5. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40

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