client telnet en c

client telnet en c - C - Programmation

Marsh Posté le 13-07-2006 à 18:09:11    

Bonjour,
Voici un prog qui est cense etre un client telnet.
Probleme ca bloque au moment de lire l'entree standart.
[fixed

]#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>
#define LG_BUFFER=2048
main(argc,argv)
int argc;
char **argv;
{
char buffer[2048];
int socket1,connection,nb_lu,i;
struct sockaddr_in addr_distant;
struct servent *service_distant;
struct termios term_initial,term_com;
fd_set set;
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" );
printf("\nvaleur apres inet_aton() \t%08X",ntohl(addr_distant.sin_addr.s_addr));
printf("\nDEBUT DE PROGRAMME" );
printf("\ncration de la socket" );
if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
printf("\nCreation de socket echouee" );
printf("\nNumero de socket \t%d",socket1);
printf("\naddr_distant.sin_family \t%d",addr_distant.sin_family);
printf("\naddr_distant.sin_port\t%d",addr_distant.sin_port);
printf("\naddr_distant.sin_addr.s_addr\t%s\n",inet_ntoa(addr_distant.sin_addr.s_addr));
printf("\ntentative de connection" );
connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
printf("\nvaleur de retour apres connect %d\n",connection);
tcgetattr(STDIN_FILENO,&term_initial);
tcgetattr(STDIN_FILENO,&term_com);
term_com.c_iflag&=~(BRKINT|IGNBRK|PARMRK|ISTRIP|ICRNL|INLCR|IGNCR|IXON);
term_com.c_oflag &=~OPOST;
term_com.c_lflag &=~(ECHO,ECHONL,ICANON,IEXTEN);
term_com.c_cflag &=~(CSIZE|PARENB);
term_com.c_cflag &= (CS8);
term_com.c_cc[VTIME]=0;
term_com.c_cc[VMIN]=1;
setvbuf(stdout,NULL,_IONBF,0);
FD_ZERO (&set);
FD_SET (socket1,&set);
FD_SET (STDIN_FILENO,&set);
while(1)
{
if(select(socket1+1,&set,NULL,NULL,NULL)<0)
break;
printf("\nOn lit la socket" );
      if(FD_ISSET(socket1,&set))
 {
 if((nb_lu=read(socket1,buffer,LG_BUFFER))<=0)
 break;
 write(STDOUT_FILENO,buffer,nb_lu);
 }
printf("\nOn lit l'entree std\n" );
      if(FD_ISSET(STDIN_FILENO,&set))
 {
 if((nb_lu=read(STDIN_FILENO,buffer,LG_BUFFER))<=0)
 printf("\nonpasse la lecture de std" );
 write(socket1,buffer,nb_lu+3);
 }
}
}

Reply

Marsh Posté le 13-07-2006 à 18:09:11   

Reply

Marsh Posté le 13-07-2006 à 19:09:41    

Deja  
 

Code :
  1. #include<stdio.h>
  2. #include<sys/socket.h>
  3. #include<sys/types.h>
  4. #include<netinet/in.h>
  5. #include<netdb.h>
  6. #include<arpa/inet.h>
  7. #include<unistd.h>
  8. #include<termios.h>
  9. #define LG_BUFFER=2048
  10. main(argc,argv)
  11. int argc;
  12. char **argv;
  13. {
  14. char buffer[2048];
  15. int socket1,connection,nb_lu,i;
  16. struct sockaddr_in addr_distant;
  17. struct servent *service_distant;
  18. struct termios term_initial,term_com;
  19. fd_set set;
  20. printf("\nadresse %s",argv[1]);
  21. service_distant=getservbyname("telnet","tcp" );
  22. memset(&addr_distant,0,sizeof(struct sockaddr_in));
  23. addr_distant.sin_family=PF_INET;
  24. addr_distant.sin_port=htons(service_distant->s_port);
  25. if((inet_aton(argv[1],&addr_distant.sin_addr.s_addr))==0)
  26.  printf("\nimpossible de remplir le  champ s_addr" );
  27. printf("\nvaleur apres inet_aton() \t%08X",ntohl(addr_distant.sin_addr.s_addr));
  28. printf("\nDEBUT DE PROGRAMME" );
  29. printf("\ncration de la socket" );
  30. if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
  31.  printf("\nCreation de socket echouee" );
  32. printf("\nNumero de socket \t%d",socket1);
  33. printf("\naddr_distant.sin_family \t%d",addr_distant.sin_family);
  34. printf("\naddr_distant.sin_port\t%d",addr_distant.sin_port);
  35. printf("\naddr_distant.sin_addr.s_addr\t%s\n",inet_ntoa(addr_distant.sin_addr.s_addr));
  36. printf("\ntentative de connection" );
  37. connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
  38. printf("\nvaleur de retour apres connect %d\n",connection);
  39. tcgetattr(STDIN_FILENO,&term_initial);
  40. tcgetattr(STDIN_FILENO,&term_com);
  41. term_com.c_iflag&=~(BRKINT|IGNBRK|PARMRK|ISTRIP|ICRNL|INLCR|IGNCR|IXON);
  42. term_com.c_oflag &=~OPOST;
  43. term_com.c_lflag &=~(ECHO,ECHONL,ICANON,IEXTEN);
  44. term_com.c_cflag &=~(CSIZE|PARENB);
  45. term_com.c_cflag &= (CS8);
  46. term_com.c_cc[VTIME]=0;
  47. term_com.c_cc[VMIN]=1;
  48. setvbuf(stdout,NULL,_IONBF,0);
  49. FD_ZERO (&set);
  50. FD_SET (socket1,&set);
  51. FD_SET (STDIN_FILENO,&set);
  52. while(1)
  53. {
  54.  if(select(socket1+1,&set,NULL,NULL,NULL)<0)
  55.   break;
  56.  printf("\nOn lit la socket" );
  57.  if(FD_ISSET(socket1,&set))
  58.  {
  59.   if((nb_lu=read(socket1,buffer,LG_BUFFER))<=0)
  60.    break;
  61.   write(STDOUT_FILENO,buffer,nb_lu);
  62.  }
  63.  printf("\nOn lit l'entree std\n" );
  64.  if(FD_ISSET(STDIN_FILENO,&set))
  65.  {
  66.   if((nb_lu=read(STDIN_FILENO,buffer,LG_BUFFER))<=0)
  67.    printf("\nonpasse la lecture de std" );
  68.   write(socket1,buffer,nb_lu+3);
  69.  }
  70. }
  71. }


Message édité par Ace17 le 13-07-2006 à 19:11:34
Reply

Marsh Posté le 13-07-2006 à 19:15:31    

Qu'es ce que tu as change?

Reply

Marsh Posté le 13-07-2006 à 19:17:34    

Attention le protocole telnet utilise un NVT je ne suis pas sur que mon terminal reponde correctement au RFC854.

Reply

Marsh Posté le 13-07-2006 à 19:17:46    

yartempion a écrit :

Qu'es ce que tu as change?


La présentation. Franchement, ton pavé, est indigeste...
 
Ce codage à l'ancienne

Code :
  1. main(argc,argv)
  2.     int argc;
  3.     char **argv;
  4. {


Ne se fait plus depuis 1989. Tu étais né ?


Message édité par Emmanuel Delahaye le 13-07-2006 à 19:19:53

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-07-2006 à 19:29:27    

Oui je l'etais depuis bien longtemp,
Le probleme est que je suis sous une station HP unix et que le compilateur n'accepte pas cette nouvelle syntaxe qui se pratique tres bien sous linux.
Avec ce code je bloque au moment de lire sur sur l'entree standart.

Reply

Marsh Posté le 14-07-2006 à 22:12:28    

Code :
  1. ....
  2. #define LG_BUFFER=2048
  3. ....
  4. if((nb_lu=read(socket1,buffer,LG_BUFFER))<=0)
  5. ....


 :ouch:  :ouch:  :ouch:  
 
Ca compile ca ???

Reply

Marsh Posté le 14-07-2006 à 23:48:25    

Ace17 a écrit :

Code :
  1. ....
  2. #define LG_BUFFER=2048
  3. ....
  4. if((nb_lu=read(socket1,buffer,LG_BUFFER))<=0)
  5. ....


 :ouch:  :ouch:  :ouch:  
 
Ca compile ca ???


la ligne me paraît propre  [:petrus75]  
il y a bien une affectation d'une variable et un test.
 
Mais je suis pas sur que certains langages acceptent ça assez facilement

Reply

Marsh Posté le 15-07-2006 à 09:01:42    

Nananan c'est pas l'affection qui me gene, c'est la ligne avec le define. Personnellement j'aurais plutot ecrit :

Code :
  1. #define LG_BUFFER 2048


 
Ensuite, du cote erreurs d'execution je n'arrive pas a comprendre a quoi sert le +3 dans la ligne avec le write..(CR + LF + fin_de_chaine ?) mais surtout le write n'est pas conditionne, donc si read renvoie une erreur on est parti pour envoyer n'importe quoi via le socket.
 

Code :
  1. if((nb_lu=read(STDIN_FILENO,buffer,LG_BUFFER))<=0)
  2.    printf("\nonpasse la lecture de std" );
  3. write(socket1,buffer,nb_lu+3)


Reply

Marsh Posté le 15-07-2006 à 13:02:19    

Ace17 a écrit :

Code :
  1. ....
  2. #define LG_BUFFER=2048
  3. ....
  4. if((nb_lu=read(socket1,buffer,LG_BUFFER))<=0)
  5. ....


 :ouch:  :ouch:  :ouch:  
 
Ca compile ca ???


Tu connais le C ?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-07-2006 à 13:02:19   

Reply

Marsh Posté le 15-07-2006 à 13:09:58    

jagstang a écrit :

Tu connais le C ?


Un peu et  

#define LG_BUFFER=2048


c'est plus que fumeux...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-07-2006 à 14:40:21    

jagstang a écrit :

Tu connais le C ?

oui  :sarcastic:  

Reply

Marsh Posté le 15-07-2006 à 16:37:56    


 :sweat:


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-07-2006 à 16:39:44    

Emmanuel Delahaye a écrit :

Un peu et  

#define LG_BUFFER=2048


c'est plus que fumeux...


C'est pas à cela que je faisais allusion. Ce n'est pas toi que j'ai quoté non plus.
 
a+


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-07-2006 à 17:42:14    

Bon, je donne des explications, parce que je pense que sinon on est partis pour s'insulter ... alors qu'on pense tous les deux exactement la meme chose.
 
Si j'ai quote la ligne avec le "if" ca n'est absolument pas parce que j'ai ete surpris par l'affectation dans la condition, comme Gatsu35 semblait l'avoir compris. C'est juste parce que c'est la premiere ligne qui m'a saute aux yeux ou la macro LG_BUFFER etait utilisee.  
 
Voila, sinon bon, desole pour  le  : sarcastic :  c'etait peut etre un peu violent alors que mon message qui a provoque ta reaction n'etait pas tres explicite. Mais je peux t'assurer que je connais le C :hello:
 
 
 
 

Reply

Marsh Posté le 17-07-2006 à 13:21:24    

La compile se  passe sans probleme le premier read est et write OK des que je veux lire sur le descripteur d'entree standart ca ne marche pas le progra mme se met en attente.

Reply

Marsh Posté le 17-07-2006 à 14:24:25    

#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>
#define LG_BUFFER=2048
main(argc,argv)
int argc;
char **argv;
{
char buffer_RX[LG_BUFFER],buffer_TX[LG_BUFFER];
int socket1,connection,nb_lu,i;
struct sockaddr_in addr_distant;
struct servent *service_distant;
struct termios term_initial,term_com;
fd_set set;
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" );
printf("\nvaleur apres inet_aton() \t%08X",ntohl(addr_distant.sin_addr.s_addr));
printf("\nDEBUT DE PROGRAMME" );
printf("\ncration de la socket" );
if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
printf("\nCreation de socket echouee" );
printf("\nNumero de socket \t%d",socket1);
printf("\naddr_distant.sin_family \t%d",addr_distant.sin_family);
printf("\naddr_distant.sin_port\t%d",addr_distant.sin_port);
printf("\naddr_distant.sin_addr.s_addr\t%s\n",inet_ntoa(addr_distant.sin_addr.s_addr));
printf("\ntentative de connection" );
connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
printf("\nvaleur de retour apres connect %d\n",connection);
tcgetattr(STDIN_FILENO,&term_initial);
tcgetattr(STDIN_FILENO,&term_com);
term_com.c_iflag&=~(BRKINT|IGNBRK|PARMRK|ISTRIP|ICRNL|INLCR|IGNCR|IXON);
term_com.c_oflag &=~OPOST;
term_com.c_lflag &=~(ECHO,ECHONL,ICANON,IEXTEN);
term_com.c_cflag &=~(CSIZE|PARENB);
term_com.c_cflag &= (CS8);
term_com.c_cc[VTIME]=0;
term_com.c_cc[VMIN]=1;
setvbuf(stdout,NULL,_IONBF,0);
FD_ZERO (&set);
FD_SET (socket1,&set);
FD_SET (STDIN_FILENO,&set);
nb_lu=read(socket1,buffer,LG_BUFFER);
write(STDOUT_FILENO,buffer,nb_lu);
printf("\ndebut de la socket\n\n" );
for(i=0;i<nb_lu+1;i++)
printf("caractere %d -> %d\n",i,buffer[i]);
while(1)
{
if(select(socket1+1,&set,&set,NULL,NULL)<0)
break;
printf("\nOn teste STDIN_FILENO" );
      if(FD_ISSET(STDIN_FILENO,&set))
 {
 printf("\nOn lit l'entree STDIN_FILENO\n" );
 if((nb_lu=read(STDIN_FILENO,buffer_TX,LG_BUFFER))<=0)
 printf("\nerreur sur lectured'entree" );
 printf("\nonpasse la lecture de STDIN_FILENO" );
 write(socket1,buffer,nb_lu);
 }
printf("\nOn teste socket1" );
 if(FD_ISSET(socket1,&set))
 {
 if((nb_lu=read(socket1,buffer_RX,LG_BUFFER))<=0)
 break;
 write(STDOUT_FILENO,buffer,nb_lu);
 }
}
}


Message édité par yartempion le 17-07-2006 à 20:12:21
Reply

Marsh Posté le 17-07-2006 à 20:10:24    

J'ai fait une modif du code principalement au nivau de la fonction select() j'ai rajoute le meme ensemble pour l'ecriture sur les descripteurs et j'arrive a passer.
Un autre probleme survient, je n'ai pas une prise en main correcte en telnet je suis oblige de taper anormalement deux fois sur la touche entree de mon clavier. Je vais essaye d'intrduire une structure de temps en la fixant a 0 afin de rendre les appels read et write  non bloquant, et mettre en place deux buffers pour  RX et TX afin de ne pas ecraser ce qui est reçu d'un descripteur par l'autre.

#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>
#define LG_BUFFER=2048
main(argc,argv)
int argc;
char **argv;
{
char buffer_RX[LG_BUFFER],buffer_TX[LG_BUFFER];
int socket1,connection,nb_lu,i;
struct sockaddr_in addr_distant;
struct servent *service_distant;
struct termios term_initial,term_com;
fd_set set;
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" );
printf("\nvaleur apres inet_aton() \t%08X",ntohl(addr_distant.sin_addr.s_addr));
printf("\nDEBUT DE PROGRAMME" );
printf("\ncration de la socket" );
if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
printf("\nCreation de socket echouee" );
printf("\nNumero de socket \t%d",socket1);
printf("\naddr_distant.sin_family \t%d",addr_distant.sin_family);
printf("\naddr_distant.sin_port\t%d",addr_distant.sin_port);
printf("\naddr_distant.sin_addr.s_addr\t%s\n",inet_ntoa(addr_distant.sin_addr.s_addr));
printf("\ntentative de connection" );
connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
printf("\nvaleur de retour apres connect %d\n",connection);
tcgetattr(STDIN_FILENO,&term_initial);
tcgetattr(STDIN_FILENO,&term_com);
term_com.c_iflag&=~(BRKINT|IGNBRK|PARMRK|ISTRIP|ICRNL|INLCR|IGNCR|IXON);
term_com.c_oflag &=~OPOST;
term_com.c_lflag &=~(ECHO,ECHONL,ICANON,IEXTEN);
term_com.c_cflag &=~(CSIZE|PARENB);
term_com.c_cflag &= (CS8);
term_com.c_cc[VTIME]=0;
term_com.c_cc[VMIN]=1;
setvbuf(stdout,NULL,_IONBF,0);
FD_ZERO (&set);
FD_SET (socket1,&set);
FD_SET (STDIN_FILENO,&set);
nb_lu=read(socket1,buffer,LG_BUFFER);
write(STDOUT_FILENO,buffer,nb_lu);
printf("\ndebut de la socket\n\n" );
for(i=0;i<nb_lu+1;i++)
printf("caractere %d -> %d\n",i,buffer[i]);
while(1)
{
[b]if(select(socket1+1,&set,&set,NULL,NULL)<0)[/b]
break;
printf("\nOn teste STDIN_FILENO" );
      if(FD_ISSET(STDIN_FILENO,&set))
 {
 printf("\nOn lit l'entree STDIN_FILENO\n" );
 if((nb_lu=read(STDIN_FILENO,buffer_TX,LG_BUFFER))<=0)
 printf("\nerreur sur lectured'entree" );
 printf("\nonpasse la lecture de STDIN_FILENO" );
 write(socket1,buffer,nb_lu);
 }
printf("\nOn teste socket1" );
 if(FD_ISSET(socket1,&set))
 {
 if((nb_lu=read(socket1,buffer_RX,LG_BUFFER))<=0)
 break;
 write(STDOUT_FILENO,buffer,nb_lu);
 }
}
}


Message édité par yartempion le 17-07-2006 à 20:14:32
Reply

Marsh Posté le 28-07-2006 à 06:14:11    

Salut,
J'essaye d'afficher les premiers caracteres reçus sur la socket sous forme hexa ou decimal pour pouvoir negocier les options telnet,

Reply

Marsh Posté le 28-07-2006 à 06:25:19    

Salut,
J'essaye d'afficher les premiers caracteres reçus sur la socket sous forme hexa ou decimal pour pouvoir negocier les options telnet
Voici le code modifie

Code :
  1. #include<stdio.h>
  2. #include<sys/socket.h>
  3. #include<sys/types.h>
  4. #include<netinet/in.h>
  5. #include<netdb.h>
  6. #include<arpa/inet.h>
  7. #include<unistd.h>
  8. #include<termios.h>
  9. #define LG_BUFFER=20
  10. main(argc,argv)
  11. int argc;
  12. char **argv;
  13. {
  14. char buffer_RX[20],buffer_TX[20];
  15. int socket1,connection,nb_lu,i;
  16. struct sockaddr_in addr_distant;
  17. struct servent *service_distant;
  18. struct termios term_initial,term_com;
  19. fd_set set;
  20. printf("\nadresse %s",argv[1]);
  21. service_distant=getservbyname("telnet","tcp" );
  22. memset(&addr_distant,0,sizeof(struct sockaddr_in));
  23. addr_distant.sin_family=PF_INET;
  24. addr_distant.sin_port=htons(service_distant->s_port);
  25. if((inet_aton(argv[1],&addr_distant.sin_addr.s_addr))==0)
  26. printf("\nimpossible de remplir le  champ s_addr" );
  27. printf("\nvaleur apres inet_aton() \t%08X",ntohl(addr_distant.sin_addr.s_addr));
  28. printf("\nDEBUT DE PROGRAMME" );
  29. printf("\ncration de la socket" );
  30. if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
  31. printf("\nCreation de socket echouee" );
  32. printf("\nNumero de socket \t%d",socket1);
  33. printf("\naddr_distant.sin_family \t%d",addr_distant.sin_family);
  34. printf("\naddr_distant.sin_port\t%d",addr_distant.sin_port);
  35. printf("\naddr_distant.sin_addr.s_addr\t%s\n",inet_ntoa(addr_distant.sin_addr.s_addr));
  36. printf("\ntentative de connection" );
  37. connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
  38. printf("\nvaleur de retour apres connect %d\n",connection);
  39. tcgetattr(STDIN_FILENO,&term_initial);
  40. tcgetattr(STDIN_FILENO,&term_com);
  41. term_com.c_iflag&=~(BRKINT|IGNBRK|PARMRK|ISTRIP|ICRNL|INLCR|IGNCR|IXON);
  42. term_com.c_oflag &=~OPOST;
  43. term_com.c_lflag &=~(ECHO,ECHONL,ICANON,IEXTEN);
  44. term_com.c_cflag &=~(CSIZE|PARENB);
  45. term_com.c_cflag &= (CS7);
  46. term_com.c_cc[VTIME]=0;
  47. term_com.c_cc[VMIN]=1;
  48. /*if(tcsetattr(STDIN_FILENO,TCSNOW,term_com)!=0)*/
  49. /*printf("\ntransformation du terminal echoue" );*/
  50. /*setvbuf(stdout,NULL,_IONBF,0);*/
  51. FD_ZERO (&set);
  52. FD_SET (socket1,&set);
  53. FD_SET (STDIN_FILENO,&set);
  54. printf("\ncaracteres attendus %c %c %c",255,24,250);
  55. while(1)
  56. {
  57. if(select(socket1+1,&set,&set,NULL,NULL)<0)
  58. break;
  59. printf("\nOn teste STDIN_FILENO" );
  60.       if(FD_ISSET(STDIN_FILENO,&set))
  61. {
  62. printf("\nOn lit l'entree STDIN_FILENO\n" );
  63. if((nb_lu=read(STDIN_FILENO,buffer_TX,LG_BUFFER))<=0)
  64. printf("\nerreur sur lectured'entree" );
  65. printf("\nonpasse la lecture de STDIN_FILENO" );
  66. write(socket1,buffer_TX,nb_lu);
  67. }
  68. printf("\nOn teste socket1" );
  69. if(FD_ISSET(socket1,&set))
  70. {
  71. printf("\non passe le FDISSET" );
  72. if((nb_lu=read(socket1,buffer_RX,LG_BUFFER))<=0)
  73. break;
  74. printf("\nNb de carac lus %d\n",nb_lu);
  75. nb_lu=write(STDOUT_FILENO,buffer_RX,nb_lu);
  76. printf("\n Nb de crac ecris %d",nb_lu);
  77. for(i=0;i<nb_lu;i++)
  78. printf("\ncaractere %d qui est le carctere  -> %c -> 0x %02X -> %d\n",i,buffer_RX[i],buffer_RX[i],buffer_RX[i]);
  79. }
  80. printf("\n" );
  81. }
  82. close(socket1);
  83. }


et voici ce que j'obtients
communication20 127.0.0.1
 
adresse 127.0.0.1
valeur apres inet_aton()        7F000001
DEBUT DE PROGRAMME
cration de la socket
Numero de socket        3
addr_distant.sin_family         2
addr_distant.sin_port   23
addr_distant.sin_addr.s_addr    127.0.0.1
 
tentative de connection
valeur de retour apres connect 0
 
caracteres attendus    º
On teste STDIN_FILENO
On lit l'entree STDIN_FILENO
 
 
onpasse la lecture de STDIN_FILENO
On teste socket1
on passe le FDISSET
Nb de carac lus 3
 »$
 Nb de crac ecris 3
caractere 0 qui est le carctere  ->   -> 0x FFFFFFFF -> -1
 
caractere 1 qui est le carctere  -> » -> 0x FFFFFFFD -> -3
 
caractere 2 qui est le carctere  -> $ -> 0x 24 -> 36
 
 
On teste STDIN_FILENO
On lit l'entree STDIN_FILENO
 
 
onpasse la lecture de STDIN_FILENO
On teste socket1
on passe le FDISSET
FFFFFFFF  
Je ne comprends pas pourquoi les deux premier caracteres FFFFFFFF FFFFFFFD sont afficher ou recu sous ce format et pourquoi ils se retrouvent avec une valeur negative en decimal.

Reply

Marsh Posté le 28-07-2006 à 09:00:54    

yartempion a écrit :

Salut,
J'essaye d'afficher les premiers caracteres reçus sur la socket sous forme hexa ou decimal pour pouvoir negocier les options telnet
Voici le code modifie

Code :
  1. char buffer_RX[20],buffer_TX[20];
  2. <...>
  3.    printf("\ncaractere %d qui est le carctere  -> %c -> 0x %02X -> %d\n",i,buffer_RX[i],buffer_RX[i],buffer_RX[i]);


caractere 0 qui est le carctere  ->   -> 0x FFFFFFFF -> -1
 
caractere 1 qui est le carctere  -> » -> 0x FFFFFFFD -> -3
 
caractere 2 qui est le carctere  -> $ -> 0x 24 -> 36

Je ne comprends pas pourquoi les deux premier caracteres FFFFFFFF FFFFFFFD sont afficher ou recu sous ce format et pourquoi ils se retrouvent avec une valeur negative en decimal.


Le format %02X attent un unsigned int. Tu lui passe un char. une conversion est faite en int et le signe est étendu. Pour éviter ça, travailler en unsigned char et caster en unsigned int.

Code :
  1. unsigned char buffer_RX[20], buffer_TX[20];
  2. <...>
  3.    printf("\ncaractere %d qui est le caractere  -> %c -> 0x %02X -> %d\n",i,buffer_RX[i], (unsigned) buffer_RX[i],buffer_RX[i]);



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-07-2006 à 12:05:00    

Merci beaucoup pour ton aide.
Si tu dispose d'un code qui reproduit un client telnet je serai tres interresse afin d'en faire l'etude pour voir comment je doits procede.
Je voulais lance la commande systeme telnet mais je n'arrivais pas a garder la main sur mon process, donc j'ai decide de reecrire un client telnet.

Reply

Marsh Posté le 28-07-2006 à 12:45:08    

yartempion a écrit :

Si tu disposes d'un code qui reproduit un client telnet je serai tres interresse afin d'en faire l'etude pour voir comment je dois procéder.


http://mapage.noos.fr/emdel/reseaux.htm

Citation :

Je voulais lancer la commande systeme telnet mais je n'arrivais pas a garder la main sur mon process.


Huh ! J'ai rien compris. Le client telnet de Windows fonctionne très bien Quel est le problème ? Le serveur a-t-il bien été lancé avant ? Quels sont les paramètres du serveur ? Du client ?


Message édité par Emmanuel Delahaye le 28-07-2006 à 20:36:55

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-07-2006 à 12:57:23    

Non je me suis mal exprime.
Je veux lancer le client telnet dans un programme mais garder la main sur le prcessus qui laance le telnet et pouvoir faire une communication entre le ere et le fils mais des que je lance le telnet a l'aide de l'appel system un procesus en remplace un autre. jJe suis sous unix.

Reply

Marsh Posté le 28-07-2006 à 20:13:48    

Parce qu'il faut forker avant de faire un execvp, peut etre ?  
 
Et sinon, pour info, a quoi veux tu te connecter ? Si tu nous decris le probleme de maniere plus generale, on sera plus en mesure de t'aider. Que cherches-tu a faire ?
 
edit : ok, j'avais lu l'appel systeme alors que c'est l'appel 'system'. je crois que system ne rend pas la main tant que la commande n'est pas terminee.


Message édité par Ace17 le 28-07-2006 à 20:15:30
Reply

Marsh Posté le 31-07-2006 à 17:57:04    

Bonjour,
Je suis amene a me connecte souvent a des equipements reseaux avec des mots de passes diffrents, donc l'idee c'est de faire un fichier de login,password afin de me connecter sans avoir a taper a chque fois.
et de prendre la main.

Reply

Marsh Posté le 31-07-2006 à 19:57:27    

c'est moi ou tu est toujours sur le même soft depuis 2004 ?
 
http://forum.hardware.fr/hardwaref [...] 1670-1.htm


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 01-08-2006 à 06:09:06    

He oui j'avais trop de choses a faire j'ai du laisser tout en plan pour me consacrer au travail je n'arrivais pas a tout gerer.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed