client telnet - C - Programmation
Marsh Posté le 21-12-2004 à 13:04:53
Des tabulations et des sauts de ligne
Marsh Posté le 21-12-2004 à 13:17:38
Il est cense se connecter au port telnet d'une machine distante et justement je ne l'ai pas pompe c'est peut etre pour ça que ça ne marche pas
Marsh Posté le 21-12-2004 à 14:58:16
yartempion a écrit : Je ne comprends pas tabulation et saut d lignes |
La présentation de ton code est déplorable. Tu devrais le reformater et utiliser les balises qui vont bien : boutons [Fixe] ou [C/C++]
Marsh Posté le 22-12-2004 à 18:45:23
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<unistd.h>
#define LG_BUFFER=1024 /*TAILLE BUFFER POUR LA LECTURE ECRITURE*/
main(argc,argv)
int argc;
char **argv;/*ADRESSE IP DU SERVEUR TELNET ICI 127.0.0.1*/
{
char buffer[LG_BUFFER]; /*BUFFER POUR LA LECTURE ECRITURE*/
main(argc,argv)
int socket1,connection,nb_lu;
struct sockaddr_in addr_distant;/*structure pour adresse ip*/
struct servent *service_distant; /*structure pour N° de port*/
service_distant=getservbyname("telnet","tcp" );/*recuperation du N° de port*/
memset(&addr_distant,0,sizeof(struct sockaddr_in));/*initialisation de la structure addr_distante*/
addr_distant.sin_family=PF_INET;initialisation du domaine IP*/
addr_distant.sin_port=htons(service_distant->s_port);/*definition du port et arrangement des octets dans l ordre reseau*/
if((inet_aton(argv[1],&addr_distant.sin_addr.s_addr))==0)/*definition de l'dresse ip dans le champs s_addr*/
printf("\nimpossible de remplir le champ s_addr" );
if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)/*creation de la socket socket1*/
printf("\nCreation de socket echouee" );
printf("\ntentative de connection" );
/*demande de connction au serveeur distant*/
connection=connect(socket1,&addr_distant,sizeof(struct sockaddr_in));
printf("\nvaleur de retour apres connect %d",connection);/*verification du code retour dela demande de connection*/
setvbuf(stdout,NULL,_IONBF,0);/*vidange du buffer de sortie*/
while(1)/*boucle de leture ecriture*/
{
if((nb_lu=read(socket1,buffer,LG_BUFFER))==0)/*verification de lecture sur la socket1 et stockage dans buffer*/
break;
write(STDOUT_FILENO,buffer,nb_lu);/ecriture du buffer sur la sortie standart*/
}
}
Quand je lance le programme (connection 127.0.0.1), le prog commence a lire trois carcters me les affiche et s'arrete sur le read. Pourquoi ne me connecte t il pas alors que si je faits un telnet 127.0.0.1 je reçois l'invite de commande (login.
Marsh Posté le 22-12-2004 à 18:49:42
Si t'ecoute pas les conseils faut pas esperer de reponses.
Marsh Posté le 22-12-2004 à 18:54:13
Je veux bien ecouter mais soyer plus explicite sur la presentaion et saut de ligne et tabulation
Marsh Posté le 22-12-2004 à 18:57:25
Tu mets ton code entre ces 2 balises là, en ENLEVANT les espaces que j'ai mis après les accolades ouvrantes:
[ cpp] ici, ton code [ /cpp] |
edit: jocebug
Marsh Posté le 22-12-2004 à 19:19:35
Voici le code comme j'ai compris qu'il fallait le presnter merci pour les reponses
[ cpp]#include<stdio.h> [ /cpp]
[ cpp]#include<sys/socket.h> [ /cpp]
[ cpp]#include<netinet/in.h> [ /cpp]
[ cpp]#include<netdb.h> [ /cpp]
[ cpp]#include<arpa/inet.h> [ /cpp]
[ cpp]#include<unistd.h> [ /cpp]
[ cpp]#define LG_BUFFER=1024 [ /cpp]/*TAILLE BUFFER POUR LA LECTURE ECRITURE*/
[ cpp]main(argc,argv) [ /cpp]
[ cpp]int argc; [ /cpp]
[ cpp]char **argv;[ /cpp]/*ADRESSE IP DU SERVEUR TELNET ICI 127.0.0.1*/
[ cpp]{ [ /cpp]
[ cpp]char buffer[LG_BUFFER];[ /cpp] /*BUFFER POUR LA LECTURE ECRITURE*/
[ cpp]main(argc,argv) [ /cpp]
[ cpp]int socket1,connection,nb_lu; [ /cpp]
[ cpp]struct sockaddr_in addr_distant;[ /cpp]/*structure pour adresse ip*/
[ cpp]struct servent *service_distant;[ /cpp] /*structure pour N° de port*/
[ cpp]service_distant=getservbyname("telnet","tcp" );[ /cpp]/*recuperation du N° de port*/
[ cpp]memset(&addr_distant,0,sizeof(struct addr_distant)); [ /cpp]
[ cpp]sockaddr_in));[ /cpp]/*initialisation de la structure addr_distante*/
[ cpp]addr_distant.sin_family=PF_INET;[ /cpp]/*initialisation du domaine IP*/
[ cpp]addr_distant.sin_port=htons(service_distant->s_port);[ /cpp]/*definition du port et arrangement des octets dans l ordre reseau*/
[ cpp]if((inet_aton(argv[1],&addr_distant.sin_addr.s_addr))==0)[ /cpp]/*definition de l'dresse ip dans le champs s_addr*/
[ cpp]printf("\nimpossible de remplir le champ s_addr" ); [ /cpp]
[ cpp]if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)[ /cpp]/*creation de la socket socket1*/
[ cpp]printf("\nCreation de socket echouee" ); [ /cpp]
[ cpp]printf("\ntentative de connection" ); [ /cpp]
/*demande de connction au serveeur distant*/
[ cpp]connection=connect(socket1,&addr_distant,sizeof(struct sockaddr_in)); [ /cpp]
[ cpp]printf("\nvaleur de retour apres connect %[ /cpp]d",connection);/*verification du code retour dela demande de connection*/
[ cpp]setvbuf(stdout,NULL,_IONBF,0);[ /cpp]/*vidange du buffer de sortie*/
[ cpp]while(1)[ /cpp]/*boucle de leture ecriture*/
[ cpp]{ [ /cpp]
[ cpp]if((nb_lu=read(socket1,buffer,LG_BUFFER))==0)[ /cpp]/*verification de lecture sur la socket1 et stockage dans buffer*/
[ cpp]break; [ /cpp]
[ cpp]write(STDOUT_FILENO,buffer,nb_lu);[ /cpp]/*ecriture du buffer sur la sortie standart*/
}
}
Marsh Posté le 22-12-2004 à 19:26:15
yartempion a écrit : Voici le code comme j'ai compris qu'il fallait le presnter merci pour les reponses |
we gotta winner \o/
Marsh Posté le 22-12-2004 à 19:29:20
Là on a battu tous les records...
yartempion, faut que tu mette un [ code] au tout début du truc, et un [ /code] à la fin. PAS A CHAQUE LIGNE. Et aussi enlève l'espace entre le [ et le 'c', c'est juste pour montrer sinon ça bug...
2 sec, je te postes un screenshot
Marsh Posté le 22-12-2004 à 19:31:05
Marsh Posté le 22-12-2004 à 19:35:36
yartempion a écrit : Voici le code comme j'ai compris qu'il fallait le presnter merci pour les reponses |
Arf ! Le troll de l'année! Bravo!
Marsh Posté le 22-12-2004 à 19:52:37
Marsh Posté le 22-12-2004 à 19:56:35
Marsh Posté le 22-12-2004 à 20:01:46
OK ca va n'en jeter plus la cour est pleine,
Je vous le refaits ou vous pouvez me renseigner avec ce que vous avez
Code :
|
C'est mieux comme ça
A plus.
Marsh Posté le 22-12-2004 à 20:12:12
maintenant il manque l'indentation
Marsh Posté le 22-12-2004 à 20:17:51
Virer le K&R staïle et donner les messages d'erreur, aussi, ce serait pas mal.
Marsh Posté le 22-12-2004 à 20:25:42
Avec l'indentation ça donne :
Code :
|
et il n'ya pas de code erreur le programme se lance lit trois caracteres les affichent (des especes de hyerogliphes) et attend sur le read().
Marsh Posté le 22-12-2004 à 20:27:07
Avec l'indentation ça donne :
Code :
|
et il n'ya pas de code erreur le programme se lance lit trois caracteres les affichent (des especes de hyerogliphes) et attend sur le read().
Marsh Posté le 22-12-2004 à 20:35:34
Tu le fais le fait exprès?
Indenter c'est pas ajouter 2 espaces à chacune de tes lignes ou mal indenter un while c'est faire ressortir clairement la structure de ton code.
Genre un truc comme çà :
Code :
|
Si tu compiles avec Gcc, fait le au moins avec l'option -Wall
gcc -Wall toto.c -o toto |
Enfin le K&R ne devrait plus etre utilisé, il y a quand meme eu 2 version ANSI/ISO pour standardiser le C.
Marsh Posté le 22-12-2004 à 21:21:08
Marsh Posté le 22-12-2004 à 21:26:22
Citation : The TELNET protocol, designed for terminal-oriented remote login, is documented in RFC 854. |
http://www.scit.wlv.ac.uk/~jphb/comms/telnet.html
Marsh Posté le 23-12-2004 à 07:56:54
J'ai essaye le -Wall mais je ne vois pas ce que ça fait.
Et pour le telnet RFC854 je pensais que c'etait juste une application qui tournait sous un N° de port mais visiblement il y a tout un ensemble d'option a negocier.
J'essaye de comprendre mais je pensais qu'il suffisait de programmer une connection avec une socket et d ecrire sur la socket mais visiblement c'est un peut plus complique si quelqu'un a un source type ça me depannerai pour comprendre comment ça marche. Je vais m'informer pour savoir comment tout cela fonctionne.
Marsh Posté le 23-12-2004 à 11:08:21
Bon, on va quand même pas te laisser t'enfoncer jusqu'à devoir creuser! A mon avis, il te manque beaucoup de choses avant de commencer à écrire un client telnet comme:
* maîtriser un compilateur C
* maîtriser la mise en forme du code
* maîtriser le C
Tout ça, c'est dans des tutos partout sur le net, dont ici dans les Bibliolinks.
Je te file le lien direct au cas où: http://forum.hardware.fr/hardwaref [...] _sujet.htm
Marsh Posté le 29-12-2004 à 20:42:10
Salut a tous,
Je vous remercie pour le lien.
En effet il me manque pas mal d'acquits.
A +
Marsh Posté le 29-12-2004 à 21:23:15
J'aiessayer de consulter les tutos mais c'est un peut le fouillis si quelqu'unsait ou trouver un cours de programmation reseaux en c ça serai top sinon je vais continuer a voir les tutos.
Merci.
Marsh Posté le 29-12-2004 à 21:32:08
Ca y'est j'ai trouve la page qui m'intersse mais elle est en anglais. Je vais essaye de la lire si quelqu'un l'a en fr merci.
A+
Marsh Posté le 29-12-2004 à 22:00:20
J'ai consulte la qui cocerne la partie de prog reseaux mais il n'ya rien qui concerne la prog d'un client telnet et rien sur les terminaux virtuels qui sont necessaires pour la prog d'unclient telnet ou pour se connecter sur differentes machines.
Marsh Posté le 21-12-2004 à 12:39:20
J'essaie d'ecrire un client telnet que me manque t'il?
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<unistd.h>
#define LG_BUFFER=1024
main(argc,argv)
int argc;
char **argv;
{
char buffer[LG_BUFFER];
int socket1,connection,nb_lu;
struct sockaddr_in addr_distant;
struct servent *service_distant;
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" );
if((socket1=socket(AF_INET,SOCK_STREAM,0))<0)
printf("\nCreation de socket echouee" );
printf("\ntentative de connection" );
connection=connect(socket1,&addr_distant,sizeof(struct sockaddr_in));
printf("\nvaleur de retour apres connect %d",connection);
setvbuf(stdout,NULL,_IONBF,0);
while(1)
{
if((nb_lu=read(socket1,buffer,LG_BUFFER))==0)
break;
write(STDOUT_FILENO,buffer,nb_lu);
}
}