Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1985 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programmation socket C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programmation socket C

n°1468492
Decapfour
Posté le 31-10-2006 à 22:05:50  profilanswer
 

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 :)

mood
Publicité
Posté le 31-10-2006 à 22:05:50  profilanswer
 

n°1468512
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2006 à 23:35:42  profilanswer
 

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/
n°1468518
Decapfour
Posté le 01-11-2006 à 00:10:37  profilanswer
 

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
n°1468570
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 09:52:21  profilanswer
 

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/
n°1468622
Sve@r
Posté le 01-11-2006 à 12:20:20  profilanswer
 

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.
n°1468631
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 12:50:35  profilanswer
 

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/
n°1468635
Sve@r
Posté le 01-11-2006 à 13:00:17  profilanswer
 

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.
n°1468637
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 13:02:50  profilanswer
 

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/
n°1468646
Sve@r
Posté le 01-11-2006 à 13:23:50  profilanswer
 

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.
n°1468649
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 13:30:35  profilanswer
 

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/
mood
Publicité
Posté le 01-11-2006 à 13:30:35  profilanswer
 

n°1528729
aneurysm
Posté le 15-03-2007 à 08:50:04  profilanswer
 

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))

n°1528734
Joel F
Real men use unique_ptr
Posté le 15-03-2007 à 09:07:11  profilanswer
 

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]

n°1528746
aneurysm
Posté le 15-03-2007 à 09:23:33  profilanswer
 

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
n°1528948
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2007 à 15:33:47  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programmation socket C

 

Sujets relatifs
[socket]Vérifier l'état d'un socketSocket multiport
PB dans la programmation d'une FONCTION EXEL[c] Socket error 98 close serveur
programmationfermeture d'une socket par le distant
programmationConcours de programmation : Prologin 2007
Pb sur lecture de socket[socket] echange de messages entre client et serveur....
Plus de sujets relatifs à : Programmation socket C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR