Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3210 connectés 

  FORUM HardWare.fr
  Programmation
  C

  client telnet en c

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

client telnet en c

n°1406587
yartempion
Posté le 13-07-2006 à 18:09:11  profilanswer
 

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);
 }
}
}

mood
Publicité
Posté le 13-07-2006 à 18:09:11  profilanswer
 

n°1406625
Ace17
Posté le 13-07-2006 à 19:09:41  profilanswer
 

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
n°1406626
yartempion
Posté le 13-07-2006 à 19:15:31  profilanswer
 

Qu'es ce que tu as change?

n°1406629
yartempion
Posté le 13-07-2006 à 19:17:34  profilanswer
 

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

n°1406630
Emmanuel D​elahaye
C is a sharp tool
Posté le 13-07-2006 à 19:17:46  profilanswer
 

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/
n°1406635
yartempion
Posté le 13-07-2006 à 19:29:27  profilanswer
 

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.

n°1407094
Ace17
Posté le 14-07-2006 à 22:12:28  profilanswer
 

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 ???

n°1407110
gatsu35
Blablaté par Harko
Posté le 14-07-2006 à 23:48:25  profilanswer
 

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

n°1407152
Ace17
Posté le 15-07-2006 à 09:01:42  profilanswer
 

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)


n°1407218
jagstang
Pa Capona ಠ_ಠ
Posté le 15-07-2006 à 13:02:19  profilanswer
 

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?  
mood
Publicité
Posté le 15-07-2006 à 13:02:19  profilanswer
 

n°1407221
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-07-2006 à 13:09:58  profilanswer
 

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/
n°1407252
Ace17
Posté le 15-07-2006 à 14:40:21  profilanswer
 

jagstang a écrit :

Tu connais le C ?

oui  :sarcastic:  

n°1407264
jagstang
Pa Capona ಠ_ಠ
Posté le 15-07-2006 à 16:37:56  profilanswer
 


 :sweat:


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°1407265
jagstang
Pa Capona ಠ_ಠ
Posté le 15-07-2006 à 16:39:44  profilanswer
 

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?  
n°1407273
Ace17
Posté le 15-07-2006 à 17:42:14  profilanswer
 

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:
 
 
 
 

n°1408041
yartempion
Posté le 17-07-2006 à 13:21:24  profilanswer
 

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.

n°1408110
yartempion
Posté le 17-07-2006 à 14:24:25  profilanswer
 

#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
n°1408140
yartempion
Posté le 17-07-2006 à 20:10:24  profilanswer
 

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
n°1415013
yartempion
Posté le 28-07-2006 à 06:14:11  profilanswer
 

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

n°1415014
yartempion
Posté le 28-07-2006 à 06:25:19  profilanswer
 

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.

n°1415039
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-07-2006 à 09:00:54  profilanswer
 

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/
n°1415106
yartempion
Posté le 28-07-2006 à 12:05:00  profilanswer
 

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.

n°1415162
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-07-2006 à 12:45:08  profilanswer
 

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/
n°1415187
yartempion
Posté le 28-07-2006 à 12:57:23  profilanswer
 

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.

n°1415561
Ace17
Posté le 28-07-2006 à 20:13:48  profilanswer
 

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
n°1416833
yartempion
Posté le 31-07-2006 à 17:57:04  profilanswer
 

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.

n°1416922
jagstang
Pa Capona ಠ_ಠ
Posté le 31-07-2006 à 19:57:27  profilanswer
 

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?  
n°1417150
yartempion
Posté le 01-08-2006 à 06:09:06  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  client telnet en c

 

Sujets relatifs
les données d'une connexion client/serveurConnaitre le nom du poste client
récupérer l'adresse mac d'un client[VB6] Afficher les travaux d'un client sélectionné dans une datalist
Lancer un telnet à partir d'une page Web[VB \ Client serveur\ Excel] Sauvegarde sur client
Insérer un terminal telnet dans mon applicationclient telnet
[socket TCP] gestion de la deconnexion d1 client telnet[Java] développer un client Telnet
Plus de sujets relatifs à : client telnet en c


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR