On 6 Nov 2005 09:13:03 -0800, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> 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
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to