Transferring a file over sockets

MRAB google at mrabarnett.plus.com
Wed Dec 17 16:21:02 CET 2008


Hendrik van Rooyen wrote:
> 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()
>>
>> ===========================================================
> 
You're also sending the length as a bytestring str(fsize), which will 
have an unknown length, but you're receiving the length as exactly 8 
bytes. Either mark the end of the length in some way (with '\n'?) and 
look for that when receiving, or pad what you send to exactly 8 bytes 
(str(fsize).zfill(8)).



More information about the Python-list mailing list