annotate Demo/threads/telnet.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 59039c0856c9
children b3420b002d55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Minimal interface to the Internet telnet protocol.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # *** modified to use threads ***
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # It refuses all telnet options and does not recognize any of the other
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # telnet commands, but can still be used to connect in line-by-line mode.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # It's also useful to play with a number of other services,
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # like time, finger, smtp and even ftp.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # Usage: telnet host [port]
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # The port may be a service name or a decimal port number;
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # it defaults to 'telnet'.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 import sys, os, time
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 from socket import *
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 import thread
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 BUFSIZE = 8*1024
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # Telnet protocol characters
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 IAC = chr(255) # Interpret as command
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 DONT = chr(254)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 DO = chr(253)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 WONT = chr(252)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 WILL = chr(251)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 def main():
1430
9c707d8cf0c8 *** empty log message ***
Guido van Rossum <guido@python.org>
parents: 937
diff changeset
31 if len(sys.argv) != 2:
9c707d8cf0c8 *** empty log message ***
Guido van Rossum <guido@python.org>
parents: 937
diff changeset
32 sys.stderr.write('usage: telnet hostname\n')
9c707d8cf0c8 *** empty log message ***
Guido van Rossum <guido@python.org>
parents: 937
diff changeset
33 sys.exit(2)
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 host = sys.argv[1]
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 try:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 hostaddr = gethostbyname(host)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 except error:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 sys.stderr.write(sys.argv[1] + ': bad host name\n')
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 sys.exit(2)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 if len(sys.argv) > 2:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 servname = sys.argv[2]
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 else:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 servname = 'telnet'
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 if '0' <= servname[:1] <= '9':
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 port = eval(servname)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 else:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 try:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 port = getservbyname(servname, 'tcp')
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 except error:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 sys.stderr.write(servname + ': bad tcp service name\n')
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 sys.exit(2)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 s = socket(AF_INET, SOCK_STREAM)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 try:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 s.connect(host, port)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 except error, msg:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 sys.stderr.write('connect failed: ' + `msg` + '\n')
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 sys.exit(1)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 thread.start_new(child, (s,))
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 parent(s)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 def parent(s):
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 # read socket, write stdout
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 iac = 0 # Interpret next char as command
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 opt = '' # Interpret next char as option
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 while 1:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 data, dummy = s.recvfrom(BUFSIZE)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 if not data:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 # EOF -- exit
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 sys.stderr.write( '(Closed by remote host)\n')
1634
59039c0856c9 Don't use thread.exit_prog; let child die if EOF read
Guido van Rossum <guido@python.org>
parents: 1430
diff changeset
75 sys.exit(1)
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 cleandata = ''
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 for c in data:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 if opt:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 print ord(c)
1430
9c707d8cf0c8 *** empty log message ***
Guido van Rossum <guido@python.org>
parents: 937
diff changeset
80 ## print '(replying: ' + `opt+c` + ')'
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 s.send(opt + c)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 opt = ''
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 elif iac:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 iac = 0
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 if c == IAC:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 cleandata = cleandata + c
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 elif c in (DO, DONT):
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 if c == DO: print '(DO)',
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 else: print '(DONT)',
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 opt = IAC + WONT
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 elif c in (WILL, WONT):
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 if c == WILL: print '(WILL)',
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 else: print '(WONT)',
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 opt = IAC + DONT
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 else:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 print '(command)', ord(c)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 elif c == IAC:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 iac = 1
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 print '(IAC)',
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 else:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 cleandata = cleandata + c
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 sys.stdout.write(cleandata)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 sys.stdout.flush()
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 ## print 'Out:', `cleandata`
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 def child(s):
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 # read stdin, write socket
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 while 1:
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 line = sys.stdin.readline()
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 ## print 'Got:', `line`
1634
59039c0856c9 Don't use thread.exit_prog; let child die if EOF read
Guido van Rossum <guido@python.org>
parents: 1430
diff changeset
111 if not line: break
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 s.send(line)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 main()