[résolu] Socket et process

Amusant ces sockets…
Pourquoi est-ce que les premiers mots passent d’un coup tout seul, et les suivant passent lettres par lettres ?
??
Le read devrait marcher pourtant.
Je fais un memset à chaque fois pour vider le tampon.

 while(printf(">"),fgets(cBuffer, MAXCHAR, stdin), !feof(stdin)){
                                write(sock,cBuffer,strlen(cBuffer));
                                read(sock,cBuffer,strlen(cBuffer));
                                printf("%s\n",cBuffer);
                                memset(cBuffer, 0, MAXCHAR+1);
}

AMA (mais je n’ai pas fait de C depuis longtemps), si tu veux être sûr du flush immediat de la saisie, tu te passes de buffer, et tu passes en caractère par caractère, soit en passant en fgetc/fputc, soit en fixant MAXCHAR à 1.
Mais bon, ce n’est peut être pas ça ton soucis :wink:

Damsss, je ne peux pas répondre à ta question par contre tu devrais mettre fgets(cBuffer, sizeof cBuffer, stdin) au lieu de fgets(cBuffer, MAXCHAR, stdin)Cela permet d’éviter un risque de buffer overflow

fgets(cBuffer, sizeof(cBuffer),stdin)on est pas en perl !
Mais il n’y a pas de risque de buffer overflow: sizeof(cbuffer)=MAXCHAR+1, si je ne m’abuse :wink:

Il faut vraiment que je m’y remette au C je cite ca de mémoire et ca fait quelques années que j’ai arreté :laughing:

En ce qui me concerne, ~15ans, mais c’est comme le vélo…

Ca ne fait qu’~ 5ans moi mais je n’avais pas poussé tres loin, juste entrevue les bases.

Je me cherche des excuses mais pour avoir oublier ces parentheses je n’en ai pas :laughing:

Rahlala, pourquoi est-ce que mon select ne marche pas ?

while(1){
             lireSock = select(monSocket+1, &fd_socket, NULL,                                      NULL, NULL);                       
              if(lireSock<0){
                                perror("erreur de select");
                                exit(1);
              }
              if(lireSock==0){
                                printf(">");
                                fgets(cBuffer, MAXCHAR, stdin);
                                write(monSocket,cBuffer,strlen(cBuffer));
              }else if(FD_ISSET(monSocket,&fd_socket)){
                        printf("reception :");
                        read(monSocket,cBuffer,strlen(cBuffer));
                        printf("%s\n",cBuffer);
                        memset(cBuffer, 0, MAXCHAR+1);
              }
}

Résultat : ça n’écrit pas dans le socket, d’ailleurs c’est dans un état d’attente des 2 côtés, comme s’il bloquait au lireSock = select(…).

Essaye pour voir ce qui peut se passer un printf de lireSock juste apres lireSock = select(monSocket+1, &fd_socket, NULL, NULL, NULL);Essaye de voir aussi si tu rentre dans ta boucle while (normalement oui d’apres ce que je vois mais bon tu peux toujours essayer)

[quote=“Damsss”]Rahlala, pourquoi est-ce que mon select ne marche pas ?

while(1){
             lireSock = select(monSocket+1, &fd_socket, NULL,                                      NULL, NULL);                       
              if(lireSock<0){
                                perror("erreur de select");
                                exit(1);
              }
              if(lireSock==0){
                                printf(">");
                                fgets(cBuffer, MAXCHAR, stdin);
                                write(monSocket,cBuffer,strlen(cBuffer));
              }else if(FD_ISSET(monSocket,&fd_socket)){
                        printf("reception :");
                        read(monSocket,cBuffer,strlen(cBuffer));
                        printf("%s\n",cBuffer);
                        memset(cBuffer, 0, MAXCHAR+1);
              }
}

Résultat : ça n’écrit pas dans le socket, d’ailleurs c’est dans un état d’attente des 2 côtés, comme s’il bloquait au lireSock = select(…).[/quote]

parceque select EFFACE les sockets de rfds quand elles n’y sont pas.
Il faut les réaffecter avant chaque utilisation.

Effectivement, ça vient bien du Select(). Merci.

[quote=“ed”]
parceque select EFFACE les sockets de rfds quand elles n’y sont pas.
Il faut les réaffecter avant chaque utilisation.[/quote]
pourtant, je les ai réaffecté avant avec un FD_ZERO puis un FD_SET.
Ca bloque quand même au select.

[quote=“Damsss”][quote=“ed”]
parceque select EFFACE les sockets de rfds quand elles n’y sont pas.
Il faut les réaffecter avant chaque utilisation.[/quote]
pourtant, je les ai réaffecté avant avec un FD_ZERO puis un FD_SET.
Ca bloque quand même au select.[/quote]

Fais voirle code corrigé

Makache ! top secret… :laughing:

C’est le même code avec FD_ZERO(&fd_socket); FD_SET(monSocket, &fd_socket); avant la boucle while. 8)

C’est bon. J’ai compris les select(). En fait c’est normal que le programme attende à l’appel du select(), c’est fait pour.
C’est pas trés courant comme fonctionnement de mettre en attente le processus, mais en fait c’est trés pratique dans le cas de connexions.

Le man select_tut est trés éclairant. :bulb: