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

  FORUM HardWare.fr
  Programmation
  C++

  PB socket C et fcntl()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PB socket C et fcntl()

n°1723196
mmarc_2007
Posté le 23-04-2008 à 22:10:08  profilanswer
 

Bonjour à tous,
 
 voila j'ai un pb, je voudrais faire un serveur en c++ sous linux. Celui-ci lit sur la socket et si rien n'arrive du client il execute une autre tache. le tout dans une boucle infinie. J'ai trouvé la methode fcntl() qui permet de rendre la lecture non bloquante:
 
fcntl(isockfd,F_SETFL,O_NONBLOCK);
 
 Mais du moment ou j'ajoute cette instruction, les données récupérés par le read du serveurs sont altérés.  
exemple le client envois le caractere "c" le serveur reçois un entier negatif... Je répète que sans cette instruction tout marche parfaitement.
 
Voila un bou de mon code:
 

Code :
  1. ip="127.0.0.1";
  2. port=1977;
  3. if ( (isockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  4.  cerr<<"Unable to open a socket"<<__FILE__<<" "<<__LINE__<<endl;
  5.  exit(EXIT_FAILURE);
  6. }
  7. bzero(&servaddr, sizeof(struct sockaddr_in));
  8. servaddr.sin_family = AF_INET;
  9. servaddr.sin_port = htons(port);
  10. if (inet_pton(AF_INET, ip.c_str(), &servaddr.sin_addr) <= 0){
  11.  cerr<<"inet_pton error"<<__FILE__<<" "<<__LINE__<<endl;
  12.  exit(EXIT_FAILURE);
  13. }
  14. if (connect(isockfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) < 0) {
  15.  cerr<<"connect error"<<__FILE__<<" "<<__LINE__<<endl;
  16.  exit(EXIT_FAILURE);
  17. }
  18. //non bloquant sur la socket
  19. fcntl(isockfd,F_SETFL,O_NONBLOCK);
  20. //on attend un ordre
  21. creturn=ordre(isockfd);


 
et la methode de lecture:
 

Code :
  1. int ordre (const int isockfd) {
  2. string fileName;
  3. int creturn;
  4. int r = read(isockfd, &creturn, 1);
  5. if (r==1) return creturn;
  6. else return -1;
  7. }


 
c'est donc la valeur de creturn qui est altéré :s
 
Merci pour votre aide


Message édité par Elmoricq le 24-04-2008 à 11:09:45
mood
Publicité
Posté le 23-04-2008 à 22:10:08  profilanswer
 

n°1727611
Taz
bisounours-codeur
Posté le 02-05-2008 à 13:23:09  profilanswer
 

bah déjà : int != char. Tu lis un char dans un int, forcément ça marche pas. Commence par changer le type de creturn en char, ça ira tout de suite mieux tu verras.


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

  PB socket C et fcntl()

 

Sujets relatifs
[C#] Lecture d'un port USBFond opaque en CSS... Pb de hauteur
problème socket et threadSocket
[C/C++] Problème - Socket / Adresse IPsocket
sequencement socket lié a un formulaireLecture sur socket
[Thread/Socket] Serveur et client à la foisProbleme Socket Raw
Plus de sujets relatifs à : PB socket C et fcntl()


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