yartempion | Bonjour,
Voici un code .
Je me trouve bloque pour rendre la socket non bloquante.
Au debut tout ce passe bien je me connecte a un equipement je lis tout ce qui arrive sur la socket.
Mais lorsque il n'y a plus rien qui arrive l'appel read reste en attente pendant un certain temp
et ensuite on boucle indefiniment mais sans arriver a lire l'entree standart.
Est il necessaire de rendre la lecture d'une socket non bloquante.
Code :
- #include<stdio.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #include<netinet/in.h>
- #include<netdb.h>
- #include<arpa/inet.h>
- #include<unistd.h>
- #include<termios.h>
- #include<sys/time.h>
- #include<stdlib.h>
- #define LG_BUFFER=1
- /*procedure de negociation d'option telnet*/
- OPTION_NEGOCIEE (message_nego)
- {
- /*char *message_nego;*/
- printf("\nN° d'option %d",message_nego);
- }
- main(argc,argv)
- int argc;
- char **argv;
- {/*Debut du main*/
- unsigned char *buffer_RX,*buffer_TX;
- unsigned char *mess_nego;
- int socket1,connection,nb_lu,nb_ec,i,j,flag_nego_option;
- struct sockaddr_in addr_distant;
- struct servent *service_distant;
- struct termios term_initial,term_com;
- struct timeval delai;
- fd_set set;
- flag_nego_option=0;
- /*Preparation des parametres de connection*/
- printf("\nadresse %s",argv[1]);
- service_distant=getservbyname("telnet","tcp" );
- memset(&addr_distant,0,sizeof(struct sockaddr_in));
- addr_distant.sin_family=PF_INET;
- addr_distant.sin_port=htons(service_distant->s_port);
- if((inet_aton(argv[1],&addr_distant.sin_addr.s_addr))==0)
- printf("\nimpossible de remplir le champ s_addr" );
- /*Creation du point de communicatio*/
- if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
- printf("\nCreation de socket echouee" );
- /*Connection au point distant*/
- connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
- /*Procedure de mis en place du mode non bloquant sur stdin*/
- tcgetattr(STDIN_FILENO,&term_initial);
- tcgetattr(STDIN_FILENO,&term_com);
- term_com.c_lflag &=~(ICANON,ECHO);/*,ECHONL,ICANON,IEXTEN);*/
- term_com.c_cc[VTIME]=0;
- term_com.c_cc[VMIN]=0;
- if(tcsetattr(STDIN_FILENO,TCSANOW,term_com)!=0)
- printf("\ntransformation du terminal echoue" );
- =
- /*Modification des delaie pour passer en mode non bloquant*/
- delai.tv_sec=0;
- delai.tv_usec=0;
- while(1)
- {/*Debut du while 1*/
- /*Initialisation de l'ensemble des descripteurs a multiplexer*/
- FD_ZERO (&set);
- FD_SET (socket1,&set);
- FD_SET (STDIN_FILENO,&set);
- /*Selection de l'ensemble des descripteurs a multiplexer en reception*/
- if(select(socket1+1,&set,NULL,NULL,&delai)<0)
- break;
- /*printf("\nOn teste STDIN_FILENO" );*/
- if(FD_ISSET(STDIN_FILENO,&set))
-
- {/*Debut du if*/
- /*Initialisation d un bloc memoire pour un caractere*/
- if((buffer_RX=(char*) calloc (LG_BUFFER,sizeof (char)))==NULL)
- printf("\nImpossible d'allouer la memoire buffer_RX STDIN_FILENO" );
- nb_lu=0;
- if((nb_lu=read(STDIN_FILENO,buffer_RX,LG_BUFFER))<0)
- printf("\nerreur sur lecture d'entree ou rien a ecrire retour de nb_lu %d",nb_lu);
- if(nb_lu>0)
- nb_ec=write(socket1,buffer_TX,nb_lu);
- free(buffer_RX);
- }/*Fin du if*/
- /*printf("\nOn teste socket1" );*/
- if(FD_ISSET(socket1,&set))
- {/*Debut du if*/
- if((buffer_RX=(unsigned char*) calloc (LG_BUFFER,sizeof (unsigned char)))==NULL)
- printf("\nImpossible d'allouer la memoire buffer_RX pour socket1" );
- nb_lu=0;
- i=0;
- /*Ici on lit temp qu'il y a des donnees a lire on lit sinon on devvrai sortir*/
- while((nb_lu=read(socket1,buffer_RX,LG_BUFFER))>0)
- {/*Debut du while*/
- if(buffer_RX[0]==255)
- {/*Un caractere IAC est arrive*/
- i=1;
- if((mess_nego=(unsigned char*) calloc (i,sizeof (unsigned char)))==NULL)
- printf("\nErreur sur attribution memoire mess_nego" );
- flag_nego_option=1;
- *mess_nego=*buffer_RX;
- while(flag_nego_option==1)
- {/*debut du while*/
- printf("\non est avant realloc valeur de i %d et mess_nego = %d",i,*mess_nego);
- if((mess_nego=realloc(mess_nego,(i+1)*sizeof(unsigned char)))==NULL)
- printf("\nErreur sur attribution memoire" );
- printf("\non passe la realloc de mess_nego[0] qui est a %d *mess_nego[i] est a %d et i est a %d",*(mess_nego),*(mess_nego+i),i);
- nb_lu=read(socket1,mess_nego+i,LG_BUFFER);
- if(*(mess_nego+i)>250 && *(mess_nego+i)<255)
- { /*Phase de test 250>=IAC<255*/
- ++i;
- printf("\nvaleur de i %d",i);
- if((mess_nego=realloc(mess_nego,(i+1)*sizeof(unsigned char)))==NULL)
- printf("\nErreur sur attribution memoire" );
- nb_lu=read(socket1,mess_nego+i,LG_BUFFER);
- printf("\nnouveau mess_nego = ",*(mess_nego+i));
- for(j=0;j<=i;j++)
- printf("\nfor %d j= %d",*(mess_nego+j),j);
- /*OPTION_NEGOCIEE(mess_nego);*/
- }
- flag_nego_option=0;
- free(mess_nego);
- i=++i;
- } /*fin de while(flag_nego_option)*/
- } /*fin de if(buffer_RX[0]==255)*/
- else
- {/*Debut du else*/
- write(STDOUT_FILENO,buffer_RX,nb_lu);
- } /*Fin du else*/
- nb_lu=0;
- }/*fin du while*/
- free(buffer_RX);
- }/*Fin du if*/
- }/*Fin du while 1*/
- close(socket1);
- if((tcsetattr(STDIN_FILENO,TCSANOW,term_initial))!=0)
- printf("\nremeise en etat du stdin echoue\n" );
- }/*fin du main*/
|
|