# -*- Mode: Python; tab-width: 4 -*- RCS_ID = '$Id: test_sendfile.py,v 1.3 2001/05/01 11:45:27 andreas Exp $' import asyncore import os import socket import string # server: just run the script with no args # client: python test_sendfile.py -c if __name__ == '__main__': import sys if '-c' in sys.argv: import operator import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) host = sys.argv[2] s.connect ((host, 9009)) fname = sys.argv[3] s.send (fname + '\r\n') size = string.atoi (s.recv(8), 16) total = 0 blocks = [] while (total < size): block = s.recv (8192) if not block: break else: total = total + len(block) blocks.append (block) import sys for b in blocks: sys.stdout.write (b) else: import asynchat_sendfile class test_channel (asynchat_sendfile.async_chat_with_sendfile): def __init__ (self, conn, addr): asynchat_sendfile.async_chat_with_sendfile.__init__ (self, conn) self.set_terminator ('\r\n') self.buffer = '' def collect_incoming_data (self, data): self.buffer = self.buffer + data def found_terminator (self): filename, self.buffer = self.buffer, '' if filename: fd = os.open (filename, os.O_RDONLY, 0644) size = os.lseek (fd, 0, 2) os.lseek (fd, 0, 0) self.push ('%08x' % size) self.push_sendfile (fd, 0, size, self.sendfile_callback) self.close_when_done() else: self.push ('ok, bye\r\n') self.close_when_done() def sendfile_callback (self, success, fd): os.close (fd) class test_server (asyncore.dispatcher): def __init__ (self, addr=('', 9009)): self.create_socket (socket.AF_INET, socket.SOCK_STREAM) self.set_reuse_addr() self.bind (addr) self.listen (2048) print 'server started on', addr def handle_accept (self): conn, addr = self.accept() test_channel (conn, addr) test_server() asyncore.loop()