socket receive file does not match sent file
Jean-Paul Calderone
exarkun at divmod.com
Sun Nov 6 13:47:07 EST 2005
On 6 Nov 2005 09:13:03 -0800, "zelzel.zsu at gmail.com" <zelzel.zsu at gmail.com> wrote:
>I wrote two simple socket program.
>one for sending a file and the other for receiving the file.
>but when I run it, a curious thing happened.
>The received file was samller that the sent file.
Your sender does not take care to ensure the entire file is sent. It will semi-randomly drop bytes from various areas in the middle of the file. Here's a sender that works correctly:
from twisted.internet import reactor, protocol
from twisted.protocols import basic
from twisted.python import log
filename = sys.argv[1]
host = sys.argv[2]
class Putter(protocol.Protocol):
def connectionMade(self):
fs = basic.FileSender()
d = fs.beginFileTransfer(file(filename, 'b'), self.transport)
d.addCallback(self.finishedTransfer)
d.addErrback(self.transferFailed)
def finishedTransfer(self, result):
self.transport.loseConnection()
def transferFailed(self, err):
print 'Transfer failed'
err.printTraceback()
self.transport.loseConnection()
def connectionLost(self, reason):
reactor.stop()
f = protocol.ClientFactory()
f.protocol = Putter
reactor.connectTCP(host, 9000, f)
reactor.run()
Of course, this is still not entirely correct, since the protocol specified by your code provides not mechanism for the receiving side to determine whether the connection was dropped because the file was fully transferred or because of some transient network problem or other error. One solution to this is to prefix the file's contents with its length.
Jean-Paul
More information about the Python-list
mailing list