Programmation socket C

Programmation socket C - C - Programmation

Marsh Posté le 31-10-2006 à 22:05:50    

Bonjour !
Voila j'ai un petit problème sur un programmation d'un envoi de 6 chiffres aléatoire d'un serveur a un client une fois la connection établie.
Apparement cela viendrait d'une conversion de données dans le buffer d'envoi, mais c'est pas très clair.
 

Citation :


Partie Serveur :  
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h> /* close */
#include <stdlib.h>
 
#define SERVER_PORT 1500
#define MAX_MSG 100
 
 
 
 
int main (int argc, char *argv[]) {
   
   int sd, newSd, cliLen, n, Chiffre, i;
 
   struct sockaddr_in cliAddr, servAddr;
   char buffer[MAX_MSG];
 
 
  /* create socket */
  sd = socket(AF_INET, SOCK_STREAM, 0);
   if(sd<0) {
    perror("cannot open socket " );
    exit(1);
  }
   
 
 
  /* bind server port */
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(SERVER_PORT);
   
   
 
if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) {
    perror("cannot bind port " );
    exit(1);
  }
 
  listen(sd,5);
   
 
 
    printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT);
 
    cliLen = sizeof(cliAddr);
    newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen);
    if(newSd<0) {
      perror("cannot accept connection " );
      exit(1);
 }
 
 /*chiffres aleatoires*/
 
 srand ((unsigned) time (NULL));
 for ( i = 0; i < 7; i++ )
 {
  Chiffre = rand() % 10;
  sprintf(buffer,"chiffre %d : %x", i, Chiffre);
  printf("%x : données envoyees \n",buffer) ;
 }
   
  n = write(newSd, buffer , strlen(buffer)+1);
  printf("%d : données envoyees \n",n) ;
 
     
   
     
     close(newSd) ;
  close (sd) ;
     return 0;
 }


 

Citation :


Partie Client :  
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h> /* close */
#include <stdlib.h>
 
#define SERVER_PORT 1500
#define MAX_MSG 100
 
int main (int argc, char *argv[]) {
 
  int sd, n, i;
   struct sockaddr_in localAddr, servAddr,cliAddr;
   struct hostent *h;
  char buffer[MAX_MSG];
   
  if(argc < 3) {
    printf("usage: %s <server> <data1> <data2> ... <dataN>\n",argv[0]);
    exit(1);
  }
 
  h = gethostbyname(argv[1]);
  if(h==NULL) {
    printf("%s: unknown host '%s'\n",argv[0],argv[1]);
    exit(1);
  }
 
  servAddr.sin_family = h->h_addrtype;
  memcpy((char *) &servAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
  servAddr.sin_port = htons(SERVER_PORT);
 
  /* create socket */
  sd = socket(AF_INET, SOCK_STREAM, 0);
  if(sd<0) {
    perror("cannot open socket " );
    exit(1);
  }
 
  /* bind any port number */
  localAddr.sin_family = AF_INET;
  localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  localAddr.sin_port = htons(0);
   
  n = bind(sd, (struct sockaddr *) &localAddr, sizeof(localAddr));
  if(n<0) {
    printf("%s: cannot bind port TCP %u\n",argv[0],SERVER_PORT);
    perror("error " );
    exit(1);
  }  
  /* connect to server */
  n = connect(sd, (struct sockaddr *) &servAddr, sizeof(servAddr));
  if(n<0)  
  {
    perror("cannot connect " );
    exit(1);
  }
      n = read(sd,buffer,MAX_MSG);
    printf("taille données lues : %d\n",n);  
      if (n < 0) error("ERROR reading from socket" );
      printf("chiffres: %x\n",buffer);
 
     return 0;
}


 
 
Merci d'avance :)

Reply

Marsh Posté le 31-10-2006 à 22:05:50   

Reply

Marsh Posté le 31-10-2006 à 23:35:42    

Decapfour a écrit :

Voila j'ai un petit problème sur un programmation d'un envoi de 6 chiffres aléatoire d'un serveur a un client une fois la connection établie.
Apparement cela viendrait d'une conversion de données dans le buffer d'envoi, mais c'est pas très clair.


Si cette chose était une fonction testée, validée, on y verrait plus clair... Si on avait en plus une specification des données sur le réseau ce serait encore mieux.

Code :
  1. /*chiffres aleatoires*/
  2. srand ((unsigned) time (NULL));
  3. for ( i = 0; i < 7; i++ )
  4. {
  5.   Chiffre = rand() % 10;
  6.   sprintf(buffer,"chiffre %d : %x", i, Chiffre);
  7.   printf("%x : données envoyees \n",buffer) ;
  8. }


Pourquoi les gens travaillent comme des gorets comme ça. Ils n'aiment pas leur métier ou quoi ?


Message édité par Emmanuel Delahaye le 31-10-2006 à 23:38:02

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-11-2006 à 00:10:37    

Ou ils apprennent aussi peut etre ^^
Je devrais envoyer toute une chaine d'entier sur le buffer d'un coup?
Et pour la conversion des entiers en hexa, c'est correct?
Qu'entends tu par spécification des données sur le reseau?
Désolé pour les "é" déformés, je crois qu'il a pas trop aimé le passage par le zip.
Merci d'avance :)

Message cité 2 fois
Message édité par Decapfour le 01-11-2006 à 00:14:13
Reply

Marsh Posté le 01-11-2006 à 09:52:21    

Decapfour a écrit :

Ou ils apprennent aussi peut etre


Quand on prétend manipuler les sockets, on est censé maitriser le C...

Citation :

Je devrais envoyer toute une chaine d'entier sur le buffer d'un coup?


J'en sais rien. Qu'est-ce qu'on t'a demandé de mettre sur le réseau ?

Citation :

Et pour la conversion des entiers en hexa, c'est correct?


Même réponse ...

Citation :

Qu'entends tu par spécification des données sur le reseau?


Le simple fait que tu poses la question est gravissime. Tu travailles sans specifications ? Tu ne sais pas ce que tu fais ?
 
Tout processus de construction de n'importe quoi passe par 3 étapes fondatrices :
 
1 - Définition (Quoi ?)
2 - Conception (Comment ?)
3 - Réalisation. (Ici, codage et tests...)
 
Alors essaye de remplir la case 1, sinon, on ne sait pas où on va.
 
Pour t'aider :  
 
Tu veux apparemment envoyer une séquence de 7 chiffres pseudo-aléatoires entre 0 et 9. OK, Mais la question est quelle tronche doit avoir les données sur le réseau ?
Binaire (quel format ?)
ASCII ? autre ?
Quel est la position du tirage 0 ? En tête, en queue ?
Et le protocole ? Y'a-t-il un préambule, une taille, un repère quelconque, un identificateur, une date, un numéro d'ordre, un somme de contrôle ou est-ce qu'on balance des données en vrac et que le le récepteur sait systématiquement ce qu'il reçoit ? Bref, on veut des détails sur la procédure mise en oeuvre, le protocole...
 
On arrête de bricoler et on commence à travailler réellement...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-11-2006 à 12:20:20    

Decapfour a écrit :

Qu'entends tu par spécification des données sur le reseau?


Pour symboliser très grossièrement: Si tu transfères le nombre 5 de ta machine où il est codé de gauche à droite (00000101), vers une machine d'architecture différente où les nombres sont codés de droite à gauche (10100000), tu récupères 160 de l'autre coté.
http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf

Message cité 1 fois
Message édité par Sve@r le 01-11-2006 à 12:57:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-11-2006 à 12:50:35    

Sve@r a écrit :

Pour symboliser très grossièrement: Si tu transfères le nombre 5 de ta machine où il est codé de gauche à droite (00000101), vers une machine d'architecture différente où les nombres sont codés de droite à gauche (10100000), tu récupères 150 de l'autre coté.


Euh, non. Heureusement, l'ordre des bits sur le réseau est standard (MSB en tête). Par contre la façon de coder les données peut changer.  
 
Binaire ?  
- Combiens d'octets ? 1, 2, 4 ?  
- Si >1, quel endianness (le réseau, c'est MSB en tête).
Texte ?  
- Quel charset ? ASCII, EBCDIC, EXOTIC ?
- Quel format ? Fixe, Espaces, CSV...
etc.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-11-2006 à 13:00:17    

Emmanuel Delahaye a écrit :

Euh, non. Heureusement, l'ordre des bits sur le réseau est standard (MSB en tête).


Ben oui mais si tu bazardes ton nombre en brut sans avoir pensé à le convertir en "entier réseau", tu le reçois en brut de l'autre coté évidemment sans penser à le reconvertir et là, tu te peux te retrouver avec un nombre inversé...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-11-2006 à 13:02:50    

Sve@r a écrit :

Ben oui mais si tu bazardes ton nombre en brut sans avoir pensé à le convertir en "entier réseau", tu le reçois en brut de l'autre coté évidemment sans penser à le reconvertir et là, tu te peux te retrouver avec un nombre inversé...


C'est l'ordre des octets qui peut changer, pas l'ordre des bits.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-11-2006 à 13:23:50    

Emmanuel Delahaye a écrit :

C'est l'ordre des octets qui peut changer, pas l'ordre des bits.


Exact - Mauvais exemple initial
En fait, on peut partir de 5 (0x0005) et se retrouver avec 1280 (0x0500)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-11-2006 à 13:30:35    

Sve@r a écrit :

Exact - Mauvais exemple initial
En fait, on peut partir de 5 (0x0005) et se retrouver avec 1280 (0x0500)


Voilà. Mais ça n'arrive pas si on respecte le format réseau qui est MSB en tête :  
 
0x0005 est codé  
[0] 0x00
[1] 0x05
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-11-2006 à 13:30:35   

Reply

Marsh Posté le 15-03-2007 à 08:50:04    

hey emmanouel tu te sent vraiment obligé de placer tes reflections de geek énervé? le gars vient te poser une question avec toutes les regles d'usage pour justement eviter de froisser les gens comme toi :
 -politesse
 -espacement et présentation
 -révisions des fautes d'orthographes
 
et toi lol tu plombe parce que tu lui reproche de ne pas savoir programmer (proprement?) alors qu'il ne viendrai pas par ici si c'était le cas....
alors mÔssieur  je sais bien que tu as envie de prouver à tout le monde que tu es passé au niveau supérieur de la programmation C et que de toucher à ca c'est comme toucher a ta copine mais calme toi c'est carrement chiant à la longue
MERCIII (règle d'usage n°16)
((d'ailleurs j'ai remarqué que les règles d'usages ne s'appliquent pas toutes aux reponses lol -->politesse et courtoisie))

Reply

Marsh Posté le 15-03-2007 à 09:07:11    

aneurysm a écrit :

alors mÔssieur  je sais bien que tu as envie de prouver à tout le monde que tu es passé au niveau supérieur de la programmation C et que de toucher à ca c'est comme toucher a ta copine mais calme toi c'est carrement chiant à la longue


 
ouais lol ca doit être ça :o
C'est toujours bien de parler sans savoir de qui on parle ^^ ((lol))  
La problèmatique soulevé par Emmanuel est plus que recurrente : on voti débarquer trouzemilles gugus
dont le premier problème n'est pas la programmation {lol} mais le fait qu'il n'ai eu AUCUNE reflexion
préalable. Sur ce point là, je comprends que ça agace :o
Donc, reste poli toi aussi s'il te plait ;) [lol]

Reply

Marsh Posté le 15-03-2007 à 09:23:33    

Je suis désolé mais son post sent un minimum de recherche, son probleme est ciblé et il donne sa source.
Ensuite j'ai des problemes avec les sockets et je vien de lire une paire de ces post et je dois bien avouer qu'à chacune de ses apparitions ... il est toujours égale a lui meme, toujours désagréable...
On se demande même ce qu'il vien faire ici (aider?) si il se plaint toujours ou alors il passe de sacré journées de me***.
Alors moi je soulève la problematique des gens qui donnent des reponses dans ce genre aux personnes qui ne s'y connaissent pas ou peu.. Je suis désolé mais je n'accepte pas ce genre de reponse de geek qui essai de plomber les gens qui ont du mal dans un domaine parcqu'ils se font plomber dans les autres... ca craint...
Ou alors on peut appeler ce forum un forum foutage de gueule ou de reponses désagréable...
 
Et j'avai soigneusement évité les impolitesses pour ne pas recevoir ce genre de reponse..... raté :pfff:

Message cité 1 fois
Message édité par aneurysm le 15-03-2007 à 09:27:05
Reply

Marsh Posté le 15-03-2007 à 15:33:47    

aneurysm a écrit :

il est toujours égale a lui meme, toujours désagréable...
On se demande même ce qu'il vien faire ici (aider?) si il se plaint toujours ou alors il passe de sacré journées de me***.


Tu as une aide à fournir au lieu de perdre ton temps (et le mien) ? Parce que je te signale que moi, je fournis de l'aide, contrairement à toi qui de fait que de te plaindre de problèmes qui ne te concernent pas...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed