[Tutor] socket and lost data

le dahut le.dahut at laposte.net
Fri Jan 27 08:01:34 EST 2006


Thanks for this answer.
Client do:
size1, passed1 = envoyer(conn, 50)
size2, passed2 = envoyer(conn, int(size1/passed1))
size3, passed3 = recevoir(conn)
size4, passed4 = recevoir(conn)
print size2/passed2
print size4/passed4

Server do:
recevoir(conn)
recevoir(conn)
size1, passed1 = envoyer(conn, 50)
size2, passed2 = envoyer(conn, int(size1/passed1))

This failed when client do its second 'envoyer' and server sees it still 
as first 'recevoir'. Why ?
I tried conn.shutdown(socket.SHUT_WR) to show first sending is 
terminated but I naturally got a "broken pipe" for the second sending so 
how can I resolve this problem ? Putting a time.sleep() in the client is 
ineffective ...
Any idea ?



Kent Johnson a écrit :
> le dahut wrote:
> 
>>Hi,
>>I try to send some data across a network (between 400KB and 10MB) like 
>>this :
>>def envoyer(conn, mysize):
>>     print mysize,' KB sent'
>>     data = '1'*1024
>>     data_end = data[:-5]+'#####'
>>     data = data*(mysize-1)
>>     begining = time.time()
>>     conn.send(data)
>>     conn.send(data_end)
>>     passed = time.time() - begining
>>     return passed, size
>>
> 
> 
> socket.send() may not send all the data - it returns a count telling you 
> what it actually did. Use socket.sendall() or put your call to send() in 
> a loop.
> 
> 
>>and receive it like this :
>>
>>def recevoir(conn):
>>     data=''
>>     while 1:
>>         tmpdata = conn.recv(8192)
>>         data += tmpdata
>>         if '#####' in data:
>>             print 'END OF DATA'
>>             break
>>     print len(data)/1024, ' KB received'
>>     return passed, int(data[-15:-5])/1024
> 
> 
> socket.recv() will return an empty string when there is no more data - I 
> would look for that instead of your marker, it is more general. Instead of
>    if '#####' in data:
> you can say
>    if data == '':
> or just
>    if not data:
> 
> 
>>But I don't receive as much data that I sent ... does someone know why ?
>>If I want to send the same data back to the client, do I have to destroy 
>>and recreate the socket ?
> 
> 
> If this doesn't fix it, maybe an example of the lost data would help.
> 
> Kent
> 



More information about the Python-list mailing list