PB socket C et fcntl()

PB socket C et fcntl() - C++ - Programmation

Marsh Posté le 23-04-2008 à 22:10:08    

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
Reply

Marsh Posté le 23-04-2008 à 22:10:08   

Reply

Marsh Posté le 02-05-2008 à 13:23:09    

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.

Reply

Sujets relatifs:

Leave a Replay

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