client telnet en c - C - Programmation
Marsh Posté le 13-07-2006 à 19:09:41
Deja
Code :
|
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.
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 :
|
Ne se fait plus depuis 1989. Tu étais né ?
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.
Marsh Posté le 14-07-2006 à 22:12:28
Code :
|
Ca compile ca ???
Marsh Posté le 14-07-2006 à 23:48:25
Ace17 a écrit :
|
la ligne me paraît propre
il y a bien une affectation d'une variable et un test.
Mais je suis pas sur que certains langages acceptent ça assez facilement
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 :
|
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 :
|
Marsh Posté le 15-07-2006 à 13:02:19
Ace17 a écrit :
|
Tu connais le C ?
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...
Marsh Posté le 15-07-2006 à 14:40:21
ReplyMarsh Posté le 15-07-2006 à 16:37:56
Marsh Posté le 15-07-2006 à 16:39:44
Emmanuel Delahaye a écrit : Un peu et
|
C'est pas à cela que je faisais allusion. Ce n'est pas toi que j'ai quoté non plus.
a+
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
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.
Marsh Posté le 17-07-2006 à 14:24:25
#include<stdio.h> |
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> |
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,
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 :
|
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.
Marsh Posté le 28-07-2006 à 09:00:54
yartempion a écrit : Salut,
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 :
|
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.
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 ?
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.
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.
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.
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
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.
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);
}
}
}