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