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 :
- ip="127.0.0.1";
- port=1977;
- if ( (isockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- cerr<<"Unable to open a socket"<<__FILE__<<" "<<__LINE__<<endl;
- exit(EXIT_FAILURE);
- }
- bzero(&servaddr, sizeof(struct sockaddr_in));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(port);
- if (inet_pton(AF_INET, ip.c_str(), &servaddr.sin_addr) <= 0){
- cerr<<"inet_pton error"<<__FILE__<<" "<<__LINE__<<endl;
- exit(EXIT_FAILURE);
- }
- if (connect(isockfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) < 0) {
- cerr<<"connect error"<<__FILE__<<" "<<__LINE__<<endl;
- exit(EXIT_FAILURE);
- }
- //non bloquant sur la socket
- fcntl(isockfd,F_SETFL,O_NONBLOCK);
- //on attend un ordre
- creturn=ordre(isockfd);
|
et la methode de lecture:
Code :
- int ordre (const int isockfd) {
- string fileName;
- int creturn;
- int r = read(isockfd, &creturn, 1);
- if (r==1) return creturn;
- else return -1;
- }
|
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