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

Réseau C Discussion :

client C server JAVA


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Par défaut client C server JAVA
    Salut à tous,
    je (crise) un peu, j'ai une application client/serveur en JAVA qui tourne très bien,
    la partie de cette appli fonctionne en TCP :

    voici la fonction qui recupere les messages en byte par byte en 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
     
    	/**
             * reception de bytes
             * @return
             * @throws IOException
             */
    	public byte[] readBytes() throws IOException {
    		InputStream in = s.getInputStream();
    		DataInputStream dis = new DataInputStream(in);
     
    		int len = dis.readInt();
    		byte[] data = new byte[len];
     
    		if(len>0) {
    			dis.readFully(data);
    		}
    		return data;
    	}
    celle ci fonctionne très bien en JAVA,

    mais en C , c'est tout autre chose, mon client se connecte sur mon serveur, jusqu'ici très bien, mais rien ne parvient a être envoyé, j'utilise la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char *buffer2 = "testnom\r\n";
      send(sock,buffer2,sizeof(buffer),0);
    j'ai des tests sur chacunes des fonctions importante en C qui me retourne un message d'erreur en cas d'echec, et toutes les fonctions "fonctionnent parfaitment".

    Vous voyez autre chose ?


    mon code pour l'instant assez sale en 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
     
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
     
    #define SERVEURNAME "127.0.0.1"
     
    int sock = -1;
     
    void
    main (void)
    {
     
      char *server_name = SERVEURNAME;
      struct sockaddr_in serverSockAddr;
      struct hostent *serverHostEnt;
      long hostAddr;
      long status;
      char buffer[512];
     
     
     
      bzero (&serverSockAddr, sizeof (serverSockAddr));
      hostAddr = inet_addr (SERVEURNAME);
      if ((long) hostAddr != (long) -1)
        bcopy (&hostAddr, &serverSockAddr.sin_addr, sizeof (hostAddr));
      else
        {
          serverHostEnt = gethostbyname (SERVEURNAME);
          if (serverHostEnt == NULL)
    	{
    	  printf ("ServerHost ERROR\n");
    	  return (-1);
    	}
     
          bcopy (serverHostEnt->h_addr, &serverSockAddr.sin_addr,
    	     serverHostEnt->h_length);
        }
      serverSockAddr.sin_port = htons (50987);
      serverSockAddr.sin_family = AF_INET;
     
    /* creation de la socket */
     
      sock = createTCP();
    /* requete de connexion */
      if (connect (sock,
    	       (struct sockaddr *) &serverSockAddr,
    	       sizeof (serverSockAddr)) < 0)
        {
          printf ("Connection ERROR\n");
          return (-1);
        }
      printf("connexion success\n");
    /* envoie de donne et reception */
      char *buffer2 = "testnom\0";
      send(sock,buffer2,sizeof(buffer+1),0);
      printf("emmssion du nom terminée");
      read (sock, buffer, 512);
      printf (buffer);
    /* fermeture de la connection */
     
      close (sock);
    }
     
     
     
    //file mainfun.c
    int createTCP() {
      if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
        {
          printf ("creation socket ERROR\n");
          return (-1);
        }
      return sock;
    }

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    "sizeof(buffer)" est la taille d'un pointeur, pas la taille de ta chaine. Ce que tu veux envoyer c'est strlen(buffer) (ou strlen(buffer) + 1 si tu veux envoyer le 0 final).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Par défaut
    ouep je viens de m'en rendre compte aussi, maintenant j'ai recuperer une belle fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      char *text = "Hello world\n";
       int n = send (sock, text, strlen (text), 0);
       if (n >= 0)
       {
          /* debug */
          printf ("%d octet%s sent\n", n, n != 1 ? "s" : "");
       }
    mais j'obtiens mainentenant une erreur dans ma focntion de reception dans mon serveur JAVA

    execption java.loang.outOfMemoryError: Java heap space
    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
    	/**
             * reception de bytes
             * @return
             * @throws IOException
             */
    	public byte[] readBytes() throws IOException {
    		InputStream in = s.getInputStream();
    		DataInputStream dis = new DataInputStream(in);
    		//ci dessous ligne pointée par l'erreur
    		>>>>> int len = dis.readInt();
    		byte[] data = new byte[len];
     
    		if(len>0) {
    			dis.readFully(data);
    		}
    		return data;
    	}

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Buffer est un tableau statique : char buffer[512]; donc sizeof(buffer) devrait rendre 512. La fonction envoie donc 513 octets. Il est quand même mieux de mettre strlen()pour ne pas envoyer ce qui ne fait pas partie de la chaine de texte.

    Je ne suis pas assez à l'aise avec ces classes Java pour trouver l'origine du problème. Mais question : comment fais-tu pointeur le InputStream vers le socket réseau ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Par défaut
    yess, pour le strlen c'est régler, merci

    pour le inputStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    serveursocket = new ServerSocket(50987);
    ...
    start();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void run() {
     
            try {
            	while(true){
    s = serveursocket.accept();
    sendBytes("Exemple pour devellopez.net".getBytes());
    ...

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Apparemment le code de ton serveur s'attend à recevoir en premier un entier de 4 octets, qu'il interprète comme le nombre de caractères à lire. Or ton code C envoie directement les caractères. Le serveur lit donc ces caractères, qui lorsqu'il sont interprétés comme un int donnent un très grand nombre (dans len). Quand tu alloues un tableau de len bytes, forcément, tu exploses le heap.

    Bref il faut que ton code C commence par envoyer le nombre de caractères qu'il va écrire, sous la forme d'un entier au format réseau (donc, utiliser htonl() pour le convertir avant de l'envoyer).

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Par défaut
    Merci, c'est exactement l'erreur que je fais je pense, l me reste plus qu'a faire ce que tu viens de dire en C, et ça c'est une autre paire de manche

Discussions similaires

  1. Application client/server - java web (léger)
    Par ben_exotic dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 28/08/2012, 10h26
  2. [vba] Envoi de fichier ascii client Windows => server Lin
    Par kremvax dans le forum Général VBA
    Réponses: 3
    Dernier message: 28/11/2005, 12h00
  3. Réponses: 5
    Dernier message: 24/09/2005, 20h31
  4. Client SQL Server
    Par ouechouech dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/04/2005, 08h22
  5. SQL Server: Java Erreur Socket
    Par BenoitM dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2003, 16h32

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