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

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    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

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    humm j'arrive pas a faire marcher ce saligot !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char *buffer[1000];
    char **toSend="test";
    ...
    sprintf(buffer,"%d",htonl(strlen(toSend)+4));
    strcat(buffer,toSend);
     
    int n = send(sock,buffer,strlen(buffer),0);
    htonl(strlen(toSend)+4) car j'ajoute à ce que je veux envoyer 4 octets qui correspondent à l'unsigned int.. j'ai toujours pas compris j'imagine ?!

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    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
    char *buffer2[1000];
    char **toSend = "test\0";
    sprintf(buffer2,"%d",htonl(strlen(toSend)));
    //strcat(buffer2,toSend);
     
     
     
    //printf("I wrote %d\n",strlen(toSend)+9);
     
    int n = send(sock,htonl(strlen(toSend)),strlen(htonl(strlen(toSend))),0);
     
    if(n>=0){
    printf("%d octets sent\n",n,n != 1 ? "s" : "");
    }
     
    n = send(sock,toSend,strlen(toSend),0);
     
    if(n>=0){
    printf("%d octets sent\n",n,n != 1 ? "s" : "");
    }
    apres reflexion,....mais ca ne fonctionne toujours pas ....

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **toSend = "test\0";
    ==>
    warning: initialization from incompatible pointer type|
    "Arrête de ton char, Ben Hur !"



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d octets sent\n",n,n != 1 ? "s" : "");
    La chaine formatée n'attends qu'un seul "paramètre", tu lui en donnes deux.


    La fonction htonl me semble mal utilisée : http://man.developpez.com/man3/htonl.3.php


    Sans oublier les warning de paramètres de types erronés pour strlen et sprintf.

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    La taille des données doit être envoyée tel quel comme une donnée binaire, pas sous forme d'une chaine ascii. Il faut envoyer directement le retour de htonl(), sans passer par un sprintf.

    Et la taille des données à envoyer, c'est 4 (sizeof(uint32_t), qui est le type de la valeur retournée par htonl()), pas strlen() de je ne sais quoi.

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    super !merci, tout fonctionne nikel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int
    receiveTCP (int sock, char **recvd)
    {
      int a;
      recv (sock, &a, 4, 0);
      int na = ntohl (a);
     
      int nb = recv (sock, recvd, sizeof (recvd), 0);
      recvd[na + 1] = '\0';
    }
    maintenant je vais a la chasse au strlen pour enlever toutces warning !

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