![]() |
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| High Level Programming Posez vos questions à propos de C, C + +, Java, SQL, et d'autres langages de programmation ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| Je veux un programme de résidence du client UDP | Nirmala | IP Networking | 1 | 06-10-2005 03:46 PM |
| L'adresse IP du client telnet | vtran4270 | UNIX pour les nuls Questions et réponses | 1 | 09-12-2002 04:34 PM |
| Est-ce que la bibliothèque client Telnet existe? | aho | High Level Programming | 0 | 09-11-2002 08:45 AM |
| Client Telnet IP détermination | thomas.jones | High Level Programming | 0 | 08-08-2002 06:17 PM |
| Utilisation de client telnet de MacOSX la ligne de commande de terminal | tylerl | UNIX pour les nuls Questions et réponses | 2 | 07-15-2001 10:05 AM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread |
Rating:
|
Modes d'affichage |
|
|
|
||||
|
Comment programmer un client telnet?
Salut, experts:
J'ai programmé un simple client telnet de SCO UNIX 5.0.5, le client a passé la pensée de la première option de négociation, mais je ne peux pas recevoir d'invite de connexion au serveur. s'il vous plaît, aidez-moi. |
|
||||
|
Cochez cette http://jos.sweetcherrie.com/src/telnet.c.html
|
|
||||
|
le fichier source (premier semestre)
Je poste les fichiers source que belows, qui comprennent tel_cli.c et tel_cli.h. Quelqu'un peut-il me dire comment puis-je obtenir l'invite de connexion et de mot de passe de l'hôte distant?
tel_cli.c: / / Nom: tel_cli.c / / Auteur: Robert / / Date: 03 janvier 2002 ---? / / Appelé: Ce module est une partie de <<Traffic données Management>> application. / / Objectif: Permet de connecter à la machine distante et lancer la commande sur la machine distante. / / Format: tel_cli $ 1 / / Entrée: $ 1 est le nom d'hôte de la machine distante, la configuration dans le local / etc / hosts. / / Exemple: tel_cli 134.132.5.11 ou tel_cli lyts1 / / Retour: aucun # include <stdio.h> # include <stdlib.h> # include <string.h> # include <ctype.h> # include <fcntl.h> # include <termio.h> # include <unistd.h> # include <stdarg.h> # include <signal.h> # include <time.h> # include <sys/types.h> # include <sys/socket.h> # include <netdb.h> # include <netinet/in.h> # include <sys/select.h> # include <arpa/inet.h> # include <stdarg.h> # include "tel_cli.h" # define LINELEN 256 / / La construction comprennent l'option id, nom d'option et l'option drapeau, le drapeau indique / / Si le client à l'option de réponse par oui ou par non, flag \u003d\u003d 1 signifie que oui. struct OptionFlag ( int Id; char * Nom; int flag; ); struct OptionFlag struOptionFlag [40]; extern int errno; int create_server (int port); int create_ftp_cli (const char * host, const char * service); int get_reply (int sock); int get_ts (int sock); int connectTCP (const char * host, const char * service); int errexit (const char * format ,...); void sigroutine (int unused); int ser_sock; / / le serveur de socket en attente pour le serveur ftp pour se connecter et d'accepter leur data_sock. data_sock int \u003d 0; / / le socket de réception ou l'envoi de fichier de données. int ctrl_sock; int par [7]; char * gs_filename / / nom de fichier dont nous avons besoin char * gs_omc_passwd; int g_iFileLen / / la longueur du fichier g_iReceivedLen int \u003d 0; / / les octets ont été reçus unsigned char gsSendMsg [LINELEN]; unsigned char gsReceiveMsg [LINELEN]; fd_set all_fds; / / Principaux progrès, selon le nombre de paramètres, l'application de décider quoi faire. int main (int argc, char * argv []) ( char * host \u003d "lyts1"; / / hôte à utiliser si aucun fournies char * service \u003d "telnet", / / par défaut le nom du service switch (argc) ( case 1: printf ( "Usage: getfile [front-aammjj nom] \ n"); sortie (1); case 3: / / service \u003d argv [2]; printf ( "Usage: getfile [front-aammjj nom] \ n"); case 2: host \u003d argv [1]; / / gs_omc_passwd \u003d argv [2]; / / gs_filename \u003d argv [3]; break; par défaut: fprintf (stderr, "Usage: getfile [front-aammjj nom] \ n"); sortie (1); ) FD_ZERO (& all_fds); ctrl_sock \u003d create_telnet_cli (accueil, service); FD_SET (ctrl_sock, & all_fds); printf ( "ctrl_sock:% d \ n", ctrl_sock); / / send_command (ctrl_sock); exit (0); ) / / Design: Robert / / Date: 03 janvier 2002 ---? / / Appelé: Ce module est appelé par les principaux processus. / / Objectif: Permet de créer un socket connecté à l'hôte spécifié, puis communiquer avec le pays hôte d'avoir des options, / / Envoyer le nom de login et mot de passe à l'accueil, le retour sock_id. / / Entrée: $ 1 (char * host): est le nom d'hôte de la machine distante. / / $ 2 (char * de service): est le type de service fourni par la machine distante, la configuration dans le local / etc / services. / / Retour: li_sock int create_telnet_cli (const char * host, const char * service) ( unsigned char rbuf [LINELEN]; / / buffer pour une ligne de texte unsigned char wbuf [LINELEN]; / / buffer pour une ligne de texte unsigned char msg [LINELEN]; unsigned char ch; unsigned char lcOption; int li_sock, li_count / / li_socket Descripteur, lire compter int outchars, inchars / / caractères envoyés et reçus int i; printf ( "entrer en telnet_cli \ n"); li_sock \u003d connectTCP (accueil, service); printf ( "li_socket est:% d \ n", li_sock); bzero (wbuf, LINELEN); bzero (rbuf, LINELEN); sprintf (wbuf, "% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c \ n ", IAC, DODO, 3, IAC, NE, 24, CCI, NE, 31, \ IAC, NE, 32, CCI, NE, 33, CCI, NE, 34, CCI, NE, 39, CCI, DODO, 5); write (li_sock, wbuf, strlen (wbuf)); / / sprintf (wbuf, "% c% c% c \ n", IAC, Wont, 37); / / write (li_sock, wbuf, strlen (wbuf)); tandis que ((li_count \u003d recv (li_sock, rbuf, LINELEN, 0))> \u003d 0) ( printf ( "longueur:% d,% s \ n", li_count, rbuf); / / sleep (5); if (li_count \u003d\u003d 0) ( printf ( "socket a été fermé! \ n"); sortie (1); ) / / si li_count> 0, cela signifie que le socket a reçu certains caractères à partir du serveur for (i \u003d 0; i <\u003d li_count - 1;) ( printf ( "rbuf [% d]:% d \ n", i, rbuf [i]); / / sleep (2); / / ch \u003d rbuf [i]; / / printf ( "% c \ n", ch); if (rbuf [i] \u003d\u003d IAC) ( / / printf ( "rbuf [% d] IAC est \ n", i); / / gsSendMsg [i] \u003d rbuf [i]; ch \u003d rbuf [i + 1]; printf ( "% d \ n", ch); / / i + +; lcOption \u003d rbuf [i + 2]; printf ( "fdsafafsafasfsafsa% d \ n", lcOption); i \u003d i + 3; switch (ch) ( DODO cas: if (lcOption \u003d\u003d AUTH) ( printf ( "RECV AUTHENTIFICATION DO (37) \ n"); / / sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c \ n", IAC, Wont, AUTH); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) if (lcOption \u003d\u003d NAWS) ( printf ( "RECV NAWS DO (31) \ n"); / / sleep (5); bzero (gsSendMsg, LINELEN); ////// SEND IAC SB NAWS 0 132 (132) 0 52 (52) / / le point clé est de trouver SB syntaxe. sprintf (gsSendMsg, "% c% c% c% d% d% d% d% c% c \ n", IAC, SB, NAWS, 0,80,0,24, IAC, SE); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) if (lcOption \u003d\u003d XDISPLOC) ( printf ( "RECV XDISPLOC DO (35) \ n"); / / sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c \ n", IAC, habitude, XDISPLOC); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) if (lcOption \u003d\u003d OLD_ENVIRON) ( printf ( "RECV ENVIRON VIEUX-DO (36) \ n"); / / sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c \ n", IAC, habitude, OLD_ENVIRON); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) if (lcOption \u003d\u003d ECHO_ON) ( printf ( "RECV DO ECHO (1) \ n"); sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c \ n", IAC, habitude, ECHO_ON); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) break; DONT cas: printf ( "ch est DONT \ n"); break; cas: if (lcOption \u003d\u003d ECHO_ON) ( printf ( "RECV WILL ECHO (1) \ n"); sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c \ n", IAC, DODO, ECHO_ON); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) break; |
|
||||
|
le fichier source (la deuxième moitié tel_cli.c et tel_cli.h)
Wont cas:
break; SB cas: printf ( "ch est SB \ n"); sleep (5); if (lcOption \u003d\u003d TSPEED) ( printf ( "IAC SB RECV TERMINAL SPEED SEND (32) \ n"); printf ( "% d% d% d \ n", rbuf [i], rbuf [i + 1], rbuf [i + 2]); / / i \u003d i + 3; sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c% c% d% d% d% d% c% c \ n", IAC, SB, TSPEED, IS, 38400>> 8, (38400 & 0xFF), 38400> > 8, (38400 & 0xFF), IAC, SE); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) if (lcOption \u003d\u003d NEW_ENVIRON) ( printf ( "RECV IAC SB NEW-ENVIRON SEND (39) \ n"); printf ( "% d% d% d \ n", rbuf [i], rbuf [i + 1], rbuf [i + 2]); / / i \u003d i + 3; sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c% c% c% c \ n", IAC, SB, NEW_ENVIRON, IS, IAC, SE); write (li_sock, gsSendMsg, strlen (gsSendMsg)); ) if (lcOption \u003d\u003d TERMINAL) ( printf ( "IAC SB RECV ENVOYER UN TERMINAL DE TYPE (24) \ n"); printf ( "% d% d% d \ n", rbuf [i], rbuf [i + 1], rbuf [i + 2]); / / i \u003d i + 3; sleep (5); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c% c% s% c% c \ n", IAC, SB, NEW_ENVIRON, IS, "ANSI", IAC, SE); write (li_sock, gsSendMsg, strlen (gsSendMsg)); printf ( "okokok \ n"); bzero (gsSendMsg, LINELEN); sprintf (gsSendMsg, "% c% c% c \ n", IAC, DODO, ECHO_ON); write (li_sock, gsSendMsg, strlen (gsSendMsg)); printf ( "okokok \ n"); ) i \u003d i + 3; break; par défaut: printf ( "ch est un autre caractère \ n"); break; ) ) autre ( / / printf ( "ch n'est pas IAC, il ya peut-être quelques erreurs se produisent! \ n"); i + +; ) ) ) ) tel_cli.h: / / code de commande telnet # define IAC 255 # define DODO 253 # define DONT 254 # define WILL 251 # define Wont 252 # define SB 250 # define SE 240 # define EST'0 ' # define SEND'1 ' # define INFO'2 ' # define VAR'0 ' # define valeur «1» # define ESC'2 ' # define USERVAR'3 ' / / nom d'option "et" id " # define ECHO_ON 1 # define GO_AHEAD 3 # define STATUS 5 # define TIMER 6 # define TERMINAL 24 # define NAWS 31 # define TSPEED 32 # define FLOW 33 # define LINEMODE 34 # define XDISPLOC 35 / / X Display Location # define OLD_ENVIRON 36 / / Old - Variables d'environnement # define AUTH 37 # define NEW_ENVIRON 39 |
|
||||
|
les fichiers source (troisième partie)
J'ai oublié d'inclure certaines fonctions nécessaires dans le fichier tel_cli.c, s'il vous plaît ajouter belowed le code source à la fin du fichier tel_cli.c.
/ * connectsock - attribuer et connecter en utilisant un socket TCP ou TCP * / int connectsock (const char * host, const char * service, const char * transport) / * Arguments: * --- D'accueil nom de l'hôte de connexion qui est souhaitée * Service - service associé le port souhaité * Transports --- nom de protocole de transport à utiliser ( "tcp" ou "udp") * / ( struct hostent * phe; / * pointeur vers l'hôte d'entrée * / struct servent * pse; / * pointeur vers l'information sur les services d'entrée * / struct protoent * ppe; / * pointeur vers l'entrée des informations de protocole * / struct sockaddr_in sin, / * un point de terminaison Internet addredd * / int s, type, / * descripteur et socket type socket * / memset (& sin, 0, sizeof (sin)); sin.sin_family \u003d AF_INET; / * Nom du service à la carte le numéro de port * / if (pse getservbyname \u003d (service, transport)) sin.sin_port \u003d pse-> s_port; else if ((sin.sin_port \u003d htons ((u_short) atoi (service))) \u003d\u003d 0) ( / / errexit ( "ne peut pas obtenir \"% s \ "entrée en service \ n", service); printf ( "ne peut pas obtenir \"% s \ "entrée en service \ n", service); return 0; ) / * Carte du nom d'hôte à adresse IP, ce qui permet de dotted decimal * / if (phe \u003d gethostbyname (host)) memcpy (& sin.sin_addr, phe-> h_addr, phe-> h_length); else if ((sin.sin_addr.s_addr \u003d inet_addr (host)) \u003d\u003d INADDR_NONE) ( / / errexit ( "ne peut pas obtenir \"% s \ "protocole d'entrée \ n", transport); printf ( "ne peut pas obtenir \"% s \ "protocole d'entrée \ n", transport); return 0; ) / * Carte du protocole de transport le nom de numéro de protocole * / if ((ppe \u003d getprotobyname (transport)) \u003d\u003d 0) ( / / errexit ( "ne peut pas obtenir \"% s \ "protocole d'entrée \ n", transport); printf ( "ne peut pas obtenir \"% s \ "protocole d'entrée \ n", transport); return 0; ) / * L'utilisateur de choisir un protocole de type socket * / if (strcmp (transport, "udp") \u003d\u003d 0) type \u003d SOCK_DGRAM; autre type \u003d SOCK_STREAM; / * Attribuer un socket * / s \u003d socket (PF_INET, type, ppe-> p_proto); if (s <0) ( / / errexit ( "ne peut pas créer de socket:% s \ n", strerror (errno)); printf ( "ne peut pas créer de socket:% s \ n", strerror (errno)); return 0; ) / * Connecter le socket * / if (connect (s, (struct sockaddr *) & sin, sizeof (sin)) <0) ( / / errexit ( "ne peut pas se connecter à% s.% s:% s \ n", accueil, service, strerror (errno)); printf ( "Impossible de se connecter à% s.% s:% s \ n", accueil, service, strerror (errno)); return 0; ) return s; ) int connectTCP (const char * host, const char * service) / * Arguments: * --- D'accueil nom de l'hôte de connexion qui est souhaitée * --- Service service associé au port désiré * / ( retour connectsock (accueil, service, "tcp"); ) / * --- Errexit imprimer un mesage d'erreur et la sortie * / / * VARARGS1 * / int errexit (const char * format ,...) ( va_list args; va_start (args, format); vfprintf (stderr, format, args); va_end (args); sortie (1); ) |
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|