Probleme socket

Résolu/Fermé
chuko - 3 juil. 2008 à 16:28
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 - 3 juil. 2008 à 17:08
bonjour a tous voila je fait apel a vous pour un probleme que je n'arrive pa a resoudre malgre mon obstination.Je poste le code pour que vous comprenier
(ps je suis encore un new bies en c).



const char buffer[1000];

void process()
{
FILE *pp;
pp=popen("cmd.exe","r");
long compt;
for(compt=0;fgets!=NULL;compt++)
{
fgets(buffer,sizeof buffer,pp);
}



}

int main(int argc, char *argv[])
{

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(23);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
while(1)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
process();
send(csock,buffer,sizeof buffer, 0);



}

}
}


voila donc la bete mon probleme etant que la boucle dans ma fonction process a savoir for(compt=0;fgets!=NULL;compt++)
{
fgets(buffer,sizeof buffer,pp);
}
semble faire merder mon socket la compilation reussi parfaitement bien mais imposible d'etre connecte sur le serveur en revanche si je retir la boucle for tout marche parfaitement bien et la je ne comprend donc pas pourquoi une simple boucle perturbe le fonctionnement de la socket si quelqu'un pouvait m'eclairer,et me dire dou vient le probleme merci d'avance.

6 réponses

Dinheru Messages postés 1019 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 17 avril 2009 67
3 juil. 2008 à 16:36
Bonjour,

Je vais te donner le conseil qu'un professeur de programation m'a dit un jour:
"N'utilise une boucle for uniquement si tu connais le nombre d'itération à l'avance"
Ce qui ne semble pas être ton cas ;-)

Donc à la place de ton for ( que je trouve très bizard ), j'utiliserais une boucle while :

while(fgets!=NULL)
{
     fgets(buffer,sizeof buffer,pp);
} 

0
merci d'avoir repondu malheuresement une boucle while a ete le premier reflexe que j'ai eu a utiliser et ça ne fonctionne pa malgre cela.A tu une autre idee d'ou proviendrai le probleme? merci par avance
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 68
3 juil. 2008 à 16:51
Ton for ne marchera pas, tu confonds boucle for, boucle while... Ta condition d'arrêt n'est pas valable en fait.

Soit tu utilises un for en indiquant au bout de combien d'itération la boucle doit s'arreter (par exemple si elle doit s'arrêter après avoir lu n caractère il faut que tu mettes for (compt=0 ; compt<n ; compt++)), mais ça c'est pas très conseiller dans ton cas car suppose que tu lui demande de lire 10 lignes mais que ta socket n'en contient que 8, ton programme restera bloqué en attendant les 2 dernières.

Dans ton cas, il vaut mieux utiliser un boucle while ou tu testeras à chaque itération si le résultat sorti n'indique pas encore que la fin de la chaîne est arrivé (c'est ce que tu voulais faire au départ j'ai l'impression...).
Ce que tu peux faire c'est
while(!feof(pp)){
    fgets(buffer, 1024, pp);
    sprintf(chaine_totale, "%s%s", chaine_totale, buffer);
}

J'ai pas tester, mais ce bout de code va lire dans ton fichier pp tant qu'il n'est pas arrivé au bout 1024 octets, les stocker dans la chaine buffer puis les ajouter à la fin de la chain chaine_totale (fais quand même gaffe à la gestion mémoire pour tous les problèmes de dépassement possible ; j'ai mis 1024 au hasard)

Par contre, j'avoue ne pas trop comprendre ce que fais ta fonction process()

Bon courage
0
merci sri lumpa d'avoir repondu je vai tester ton bout de code oui en effet ma fonction process ici ne ser pa a grand chose si ce n'est que je voulai que mon programme apelant a savoir cmd.exe ne demarre pas tant qu'une personne n'est pas connecter je n'ai trouver que cette solution.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
me revoila, je te remerci sri lumpa c'etai bien ma condition d'arrete qui fausser tout le programme en faite je vien de comprendre que je creeai une boucle infini c'est donc pour cela que ma socket ne demarai pas merci encore .
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 68
3 juil. 2008 à 17:08
Ben le problème c'est que tu utilisait comme condition d'arrêt fgets qui ici ne devait pas correspondre à ta fonction, même si elle avait le même nom... Donc en gros, tu faisait des comparaison avec une variable non-initialisée et c'est jamais franchement bon tu imagines bien :s

En tout cas, content d'avoir pu t'aider ;)
0