Transferring a file over sockets

Hendrik van Rooyen mail at microcorp.co.za
Wed Dec 17 15:01:31 CET 2008


Ferdinand Sousa  wrote:

>==========================================================
.# file receiver
># work in progress
>
>import socket
>
>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>HOST = '192.168.1.17'
>PORT = 31400
>
>s.bind((HOST, PORT))
>s.listen(3)
>conn, addr = s.accept()
>print 'conn at address',addr
>conn.send('READY')
>f = open('C:\\Documents and Settings\\USER\\Desktop\\test.pdf','wb')
>fsize=int(conn.recv(8))
>print 'File size',fsize
>f.write(conn.recv(fsize))

This recv is not guaranteed to actually receive the number of
characters you are asking for - it will stop when it has received that
many, yes, but it may return with less, or even none if there is a 
time out set.

The TCP is a more or less featureless stream of characters.

Consider including a start marker so you know where the lesson starts.
If you do this, consider the possibility of having a "false sync".
Sending/receiving  the length is good - also google for "netstring"
Google for "escaping".

Consider writing a loop to receive until the required length has been
received - look at the docs for the recv function - it can tell you how 
much has been received.

>f.close()
>conn.close()
>s.close()
>
>raw_input('Press any key to exit')
>
>
>===========================================================
>
># file sender !!!
># Work in progress
>
>import socket, os
>from stat import ST_SIZE
>
>    
>HOST = '192.168.1.17'
>PORT = 31400              # Arbitrary non-privileged port
>
>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>
>s.connect((HOST,PORT))
>if s.recv(5)!='READY':
>    raw_input('Unable to connect \n\n Press any key to exit ...')
>    s.close()
>    exit()
>
>f=open('C:\\Documents and Settings\\USER\\Desktop\\t.pdf', 'rb')
>fsize=os.stat(f.name)[ST_SIZE]
>
>s.send(str(fsize))
>s.send(f.read())

Are you sure that the send will send all the chars
that you ask it to send?

If yes - why do you think this?

What are the values that the send can return?

>
>s.close()
>f.close()
>
>===========================================================


hth - Hendrik





More information about the Python-list mailing list