python网络编程
太乱了,只把自己写的代码传上来:
#basicserver.py import socket host = '' port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) print "Waiting for connections ..." s.listen(5) while True: clientsock,clientaddr = s.accept() print 'Got connection from ',clientsock.getpeername() clientsock.close()
#broken.py import sys,socket result = socket.getaddrinfo(sys.argv[1],None) counter = 0 for item in result: print "%-2d: %s" % (counter,item[4]) counter += 1
#DNSany.py import sys,DNS def hierquery(qstring,qtype): """Given a query type qtype,returns answers of that type for lookup qstring. If not answers are found,removes the most specific component (the part before the leftmost period) and retries the query with the result. Ic the topmost query fails,returns None.""" reqobj = DNS.Request() try: answerobj = reqobj.req(name=qstring,qtype=qtype) answers = [x['data'] for x in answerobj.answers if x['type']==qtype] except DNS.Base.DNSError: answers = [] if len(answers): return answers else: remainder = qstring.split(".",1) if len(remainder) == 1: return None else: return hierquery(remainder[1],qtype) def findnameservers(hostname): """Attempts to determine the authoritative nameservers for a given hostname.Returns None on failure.""" return hierquery(hostname,DNS.Type.NS) def getrecordsfromnameserver(qstring,qtype,nslist): """Given a list of nameservers in nslist,executes the query requested by qstring and qtype on each in order,returning the data from the first server that returned 1 or more answers.If no server returned any answers,returns [].""" for ns in nslist: reqobj = DNS.Request(server = ns) try: answers = reqobj.req(name=qstring,qtype=qtype).answers if len(answers): return answers except DNS.Base.DBSError: pass return [] def nslookup(qstring,qtype,verbose=1): nslist = findnameservers(qstring) if nslist == None: raise RuntimeError,"Couild not find nameserver to use." if verbose: print "Using nameservers:",", ".join(nslist) return getrecordsfromnameserver(qstring,qtype,nslist) if __name__ == '__main__': query = sys.argv[1] DNS.DiscoverNameServers() answers = nslookup(query,DNS.Type.ANY) if not len(answers): print "Not found." for item in answers: print "%-5s %s" % (item['typename'],item['data'])
#DNS-basic.py import sys,DNS query = sys.argv[1] DNS.DiscoverNameServers() reqobj = DNS.Request() answerobj = reqobj.req(name=query,qtype=DNS.Type.ANY) if not len(answerobj.answers): print "Not found." for item in answerobj.answers: print "%-5s %s" % (item['typename'],item['data'])
#DNSquery.py import sys,DNS,DNSany,re def getreverse(query): """Given the query,returns an appropriate reverse lookup string under IN-ADDR.ARPA if query is an IP address; otherwise,returns None.This function is not IPV6-compalite.""" if re.search('^\d+\.\d+\.\d+\.\d+$',query): octets = query.split('.') octetc.reverse() return '.'.join(octets)+'.IN-ADDR.ARPA' return None def formatline(index,typename,descr,data): retval = "%-2s %-5s" % (index,typename) data = data.replace("\n","\n ") if descr != None and len(descr): retval += " %-12s" % (descr + ":") return retval + " " + data DNS.DiscoverNameServers() queries = [(sys.argv[1],DNS.Type.ANY)] donequeries = [] descriptions = {'A': 'IP address', 'TXT': 'Data', 'PTR': 'Host name', 'CNAME' : 'Alias for', 'NS': 'Name Server'} while len(queries): (query,qtype) = queries.pop(0) if query in donequeries: #Don't look up the same thing twice continue donequeries.append(query) print "-" * 77 print "Results for %s (lookup type %s)" % (query,DNS.Type.typestr(qtype)) print rev = getreverse(query) if rev: print "IP address given; doing reverse lookup using ",rev query = rev answers = DNSany.nslookup(query,qtype,verbose=0) if not len(answers): print "Not fonund." count = 0 for answer in answers: count += 1 if answer['typename'] == 'MX': print formatline(count,answer['typename'],'Mail server', "%s priority %d" % (answer['data'][1], answer['data'][0])) queries.append((answer['data'][1],DNS.Type.A)) elif answer['typename'] == 'SOA': data = "\n" + "\n".join([str(x) for x in answer['data']]) print formatline(count,"SOA","Start of authority",data) elif answer['typename'] in descriptions: print formatline(count,answer['typename'],descriptions[answer['typename']],answer['data']) else: print formatline(count,answer['typename'],None,str(answer['data'])) if answer['typename'] in ['CNAME','PTR']: queries.append((answer['data'],DNS.Type.ANY)) if answer['typename'] == 'NS': queries.append((answer['data'],DNS.Type.A))
#echoclient.py import socket,sys port = 51432 host = 'localhost' data = "x" * 10485760 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((host,port)) byteswritten = 0 while byteswritten < len(data): startpos = byteswritten endpos = min(byteswritten+1024,len(data)) byteswritten += s.send(data[startpos:endpos]) sys.stdout.write("Wrote %d bytes\r" % byteswritten) sys.stdout.flush() s.shutdown(1) print "All data sent." while True: buf = s.recv(1024) if not len(buf): break sys.stdout.write(buf)
#echoserver.py import socket,traceback host = '' port = 51432 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) s.listen(1) while True: try: clientsock,clientaddr = s.accept() except KeyboardInterrupt: raise except: traceback.print_exc() continue try: print "Got connection from",clientsock.getpeername() while True: data = clientsock.recv(4096) if not len(data): break clientsock.sendall(data) except (KeyboardInterrupt,SystemExit): raise except: traceback.print_exc() try: clientsock.close() except KeyboradInterrupt: raise except: traceback.print_exc()
#environment.py import sys,socket def getipaddrs(hostname): """Given a hos tname,perform a standard (forward) lookup and return a list of IP addresses for that host.""" result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM) return [x[4][0] for x in result] hostname = socket.gethostname() print "Host name: " ,hostname print "Fully-qualified name:",socket.getfqdn(hostname) try: print "IP address:",", ".join(getipaddrs(hostname)) except socket.gaierror,e: print "Couldn't not get IP addresses:",e
#errorserver.py import socket,traceback host = '' port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) s.listen(1) print "Waiting client connections ... " while True: try: clientsock,clientaddr = s.accept() except KeyboardInterrupt: raise except: traceback.print_exc() continue try: print "Got connection from",clientsock.getpeername() except (KeyboardInterrupt,SystemExit): raise except: traceback.print_exc() try: clientsock.close() except KeyboardInterrupt: raise except: traceback.print_exc()
#getaddrinfo-basic.py import sys,socket result = socket.getaddrinfo(sys.argv[1],None) print result[0][4]
#getaddrinfo-list import sys,socket result = socket.getaddrinfo(sys.argv[1],None,0,socket.SOCK_STREAM) counter = 0 for item in result: print "%-2d: %s" % (counter,item[4]) counter += 1
#gethostbyaddr-basic.py import sys,socket try: result = socket.gethostbyaddr(sys.argv[1]) print 'Primary hostname: ' print " " + result[0] print "\nAdresses:" for item in result[2]: print " " + item except socket.herror,e: print "Couldn't look up name:",e
#gethostbyaddr-paranoid.py import sys,socket def getipaddrs(hostname): """Get a list of IP addresses from a given hostname.This is a standard (forward) lookup.""" result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM) return [x[4][0] for x in result] def gethostname(ipaddr): """Get the hostname from a given IP address. This is a reverse lookup.""" return socket.gethostbyaddr(ipaddr)[0] try: hostname = gethostname(sys.argv[1]) ipaddrs = getipaddrs(hostname) except socket.herror,e: print "No host names available for %s; this may be normal." % sys.argv[1] sys.exit(0) except socket.gaierror,e: print "Got hostname %s,but it could not be forward-resolved: %s" %(hostname,str(e)) sys.exit(1) if not sys.argv[1] in ipaddrs: print "Got hostname %s,but on forward lookup," % hostname print "original IP %s did not appear in IP address list." % sys.argv[1] sys.exit(1) print 'Validated hostname:',hostname
#getinformation.py import socket print 'Creating socket....', s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print 'done.' print 'Looking up port number ...', port = socket.getservbyname('http','tcp') print 'done.' print 'Connecting to remote host on port %d...' % port s.connect(('www.google.com',port)) print 'done.' print 'Conencted from',s.getsockname() print 'connected to',s.getpeername()
#getport.py import socket print 'Creating socket...', s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print 'done.' print 'Looking up port number...', port = socket.getservbyname('http','tcp') print 'done.' print 'Connecting to remote host on %d...' % port, s.connect(('www.google.com',port)) print 'done.'
#htmlparse.py from urllib import urlopen from HTMLParser import HTMLParser class Scraper(HTMLParser): in_h3 = False in_link = False def handle_starttag(self,tag,attrs): attrs = dict(attrs) if tag == 'h3': self.in_h3 = True if tag == 'a' and 'href' in attrs: self.in_link = True self.chunks = [] self.url = attrs['href'] def handle_data(self,data): if self.in_link: self.chunks.append(data) def handle_endtag(self,tag): if tag == 'h3': self.in_h3 = False if tag == 'a': if self.in_h3 and self.in_link: print '%s (%s)' % (''.join(self.chunks),self.url) self.in_link = False #text = urlopen('http://bbs.gameres.com/forum_101_1.html').read() text = urlopen('http://www.baidu.com') parser = Scraper() parser.feed(text) parser.close()
#inetdserver.py import sys print "Welcom" print "Please enter a string: " sys.stdout.flush() line = sys.stdin.readline().strip() print "You entered %d characters." % len(line)
#inetdsocket.py import sys,socket,time s = socket.fromfd(sys.stdin.fileno(),socket.AF_INET,socket.SOCK_STREAM) s.sendall("Welcome .\n") s.sendall("According to our records,you are connected from %s.\n" % str(s.getpeername())) s.sendall("The local time is %s.\n" % time.asctime())
#inetdudpserver.py import socket,time,sys s = socket.fromfd(sys.stdin.fileno(),socket.AF_INET,socket.SOCK_DGRAM) message,address = s.recvfrom(8192) s.connect(address) for i in range(10): s.send("Reply %d : %s" % (i+1,message)) time.sleep(2) s.send("OK,I'm done sending replies.\n")
#inetdwaitserver.py import socket,time,sys,os s = socket.fromfd(sys.stdin.fileno(),socket.AF_IENT,socket.SOCK_DGRAM) message,address = s.recvfrom(8192) localaddr = s.getsockname() s.close() pid = os.fork() if pid: sys.exit(0) s2 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s2.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) s2.bind(localaddr) s2.connect(address) for i in range(10): s2.send("Reply %d: %s" % (i+1,message)) time.sleep(2) s2.send("OK,I'm done sending replies.\n")
#screenraw.py from urllib import urlopen import re #p = re.compile('.*<h2><a class=.*?> herf="(.*?)">(.*?)</a>.*') p = re.compile('http.*url.*') text = urlopen('http://www.baidu.com').read() #for url in p.findall(text): # print '%s ' % url import pprint pprint.pprint(p.findall(text))
import socket host = '' port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) s.listen(1) print "Server is running on port %d; press Ctr-c to terinate." % port while True: clientsock,clientaddr = s.accept() clientfile = clientsock.makefile('rw',0) clientfile.write("Welcom, " + str(clientaddr) + "\n") clientfile.write("Please enter a string: ") line = clientfile.readline().strip() clientfile.write("You entered %d characters.\n" % len(line)) clientfile.close() clientsock.close()
#shutdown.py import socket,sys,time host = sys.argv[1] textport = sys.argv[2] filename = sys.argv[3] try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) except socket.error,e: print 'Strange error creating socket: %s' % e sys.exit(1) try: port = int(textport) except ValueError: try: port = socket.getservbyname(textport,'tcp') except socket.error,e: print "Couldn't find port: %s" % e sys.exit(1) try: s.connect((host,port)) except socket.gaierror,e: print 'Address-related error connecting to server: %s' % e sys.exit(1) except socket.error,e: print 'Connetion error : %s' % e sys.exit(1) print 'sleeping ...' time.sleep(10) print 'Continuing.' try: s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename) except socket.error,e: print 'Error sending data: %s' % e sys.exit(1) try: s.shutdown(1) except socket.error,e: print "Error sending data (detected by shutdown): %s" % e sys.exit(1) while True: try: buf = s.recv(2048) except socket.error,e: print 'Error receiving data: %s' % e sys.exit(1) if not len(buf): break sys.stdout.write(buf)
#shutdownfile.py import socket,sys,time host = sys.argv[1] textport = sys.argv[2] filename = sys.argv[3] try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) except socket.error,e: print "Strang eror creating socket: %s" % e sys.exit(1) try: s.connect((host,port)) except socket.gaierror,e: print "Address-related error connecting to server: %s" % e sys.exit(1) except socket.error,e: print "Connection error: %s" % e sys.exit(1) fd = s.makefile('rw',0) print "sleeping ..." time.sleep(10) print "Continuing." try: fd.write("GET %s HTTP/1.0\r\n\r\n" % filename) except socket.error,e: print "Error sending data: %s" % e sys.exit(1) try: fd.flush() except socket.error,e: print "Error sending data (detected by flush) : %s" % e sys.exit(1) try: s.shutdown(1) s.close() except socket.error,e: print "Error sending data (dectected by shutdown) : %s" % e sys.exit(1) while True: try: buf = fd.read(2048) except socket.error,e: print "Error receiving data: %s" % e sys.exit(1) if not len(buf): break sys.stdout.write(buf)
#socket1.py import socket print 'Creating socket ...', s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print 'done ...' print 'Connecting to remote host ...', s.connect(("www.google.com",80)) print 'Done ...'
#socketrrors.py import socket,sys textport = 80 filename = r'E:/project.txt' try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) except socket.error,e: print 'Strange error creating socket: %s' % e sys.exit(1) try: port = int(textport) except ValueError: try: port = socket.getservbyname(textport,'tcp') except socket.error,e: print "Couldn't find your port: %s" % e sys.exit(1) host = 'www.baidu.com' try: s.connect((host,port)) except socket.gaierror,e: print 'Address-related error connecting to server: %s' % e sys.exit(1) except socket.error,e: print 'Connection error: %s' % e sys.exit(1) try: s.sendall('GET %s HTTP/1.0\r\n\r\n' % filename) except socket.error,e: print 'Error sending data: %s' % e sys.exit(1) while True: try: buf = s.recv(2048) except socket.error,e: print 'Error receiving data: %s' % e sys.exit(1) if not len(buf): break sys.stdout.write(buf)
#sockeksever.py import socket import sys from thread import * HOST = '' # Symbolic name meaning all available interfaces PORT = 8889 # Arbitrary non-privileged port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Socket created' #Bind socket to local host and port try: s.bind((HOST, PORT)) except socket.error , msg: print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] sys.exit() print 'Socket bind complete' #Start listening on socket s.listen(10) print 'Socket now listening' #Function for handling connections. This will be used to create threads def clientthread(conn): #Sending message to connected client conn.send('Welcome to the server. Type something and hit enter\n') #send only takes string #infinite loop so that function do not terminate and thread do not end. while True: #Receiving from client data = conn.recv(1024) reply = 'OK...' + data if not data: break conn.sendall(reply) #came out of loop conn.close() #now keep talking with the client while 1: #wait to accept a connection - blocking call conn, addr = s.accept() print 'Connected with ' + addr[0] + ':' + str(addr[1]) #start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function. start_new_thread(clientthread ,(conn,)) s.close() s.close()
#sockettest.py #Socket client example in python import socket #for sockets import sys #for exit #create an INET, STREAMing socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error: print 'Failed to create socket' sys.exit() print 'Socket Created' host = 'oschina.net'; port = 80; try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print 'Hostname could not be resolved. Exiting' sys.exit() #Connect to remote server s.connect((remote_ip , port)) print 'Socket Connected to ' + host + ' on ip ' + remote_ip #Send some data to remote server message = "GET / HTTP/1.1\r\nHost: oschina.net\r\n\r\n" try : #Set the whole string s.sendall(message) except socket.error: #Send failed print 'Send failed' sys.exit() print 'Message send successfully' #Now receive data reply = s.recv(4096) print reply s.close()
#syslogsample.py import syslog,sys,StringIO,traceback,os def logexception(includetraceback = 0): exctype,exception,exctraceback = sys.exc_info() excclass = str(exception.__class___) message = str(exception) if not includetraceback: syslog.syslog(syslog.LOG_ERR,"%s: %s" % (excclass,message)) else: excfd = StringIO.StringIO() traceback.print_exception(exctype,exception,exctraceback,None,excfd) for line in excfd.getvalue().split("\n"): syslog.syslog(syslog.LOG_ERR,line) def initsyslog(): syslog.openlog("%s[%d]" % (os.path.basename(sys.argv[0]),os.getpid()),0,syslog.LOG_DAEMON) syslog.syslog("Started.") initsyslog() try: raise RuntimeError,"Exception 1" except: logexception(0) try: raise RuntimeError,"Exception 2" except: logexception(1) syslog.syslog("I'm terminating.")
#udp.py import socket,sys host = sys.argv[1] textport = sys.argv[2] s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) try: port = int(textport) except ValueError: port = socket.getservbyname(textport,"udp") s.connect((host,port)) print "Enter data to transmit: " data = sys.stdin.readline().strip() s.sendall(data) print "Looking for replies ; press Ctrl-C or Ctrl-Break to stop." while True: buf = s.recv(2048) if not len(buf): break; sys.stdout.write(buf)
#udpechoserver.py import socket,traceback host = '' port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) while True: try: message,address = s.recvfrom(8192)33 print "Got data from",address s.sendto(message,address) except (KeyboardInterrupt,SystemExit): raise except: traceback.print_exc()
#udptimeserver.py import socket,traceback,time,struct host = '' port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) while True: try: message,address = s.recvfrom(8192) print "Got from client :",address secs = int(time.time()) secs -= 60*60*24 secs += 2208988800 reply = struct.pack("!I",secs) s.sendto(reply,address) except (KeyboardInterrupt,SystemExit): raise except: traceback.print_exc()
#udptime.py import socket,sys,struct,time port = 51423 host = socket.gethostname() s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.sendto('',(host,port)) print "Looking for replies ; press Ctrl-C to stop." buf = s.recvfrom(2048)[0] if len(buf) != 4: print "Wrong-sized reply %d: %s" % (len(buf),buf) sys.exit(1) secs = struct.unpack("!I",buf)[0] secs -= 2208988800 print time.ctime(int(secs))
这些比较乱,只看代码,属于网络编程的基础部分
有一种落差是,你配不上自己的野心,也辜负了所受的苦难