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){
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.
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:
et la methode de lecture:
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