socket receive file does not match sent file

Discussion in 'Python' started by zelzel.zsu@gmail.com, Nov 6, 2005.

  1. Guest

    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.

    $ cat receivefile.py
    #!/usr/local/bin/python
    # -*- coding: utf-8 -*-

    import socket
    import time
    import string
    import sys

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('', 9000))
    sock.listen(5)

    try:
    while True:
    # 1. client connect, open file
    newSocket, address = sock.accept()
    print "Connected from ", address

    filename = sys.argv[1]
    f=open( filename, 'wb')

    # 2. recieve data
    while True:
    data = newSocket.recv(8192)
    if not data: break
    f.write(data)
    # 3.close file
    f.close()
    print filename, "Received\n"

    finally:
    sock.close()



    $ cat putfile.py
    #!/usr/local/bin/python
    # -*- coding: utf-8 -*-

    import sys
    import socket
    import string

    # "Usage: prog file hostip"

    filename = sys.argv[1]
    host = sys.argv[2]


    f=open(filename, 'rb')
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, 9000))

    while True:
    data = f.read(8192)
    if not data: break
    else:
    s.send(data)
    f.close()
    s.close()
    print filename, " Sent!\n"

    $ python receivefile.py save_apache_1.33.tar.gz
    $ python putfile.py apache_1.33.tar.gz localhost

    The result is : save_apache_1.33.tar.gz 's size was smaller then the
    apache_1.33.tar.gz file

    What is the cause of the problem, can anyone tell me?
    Thanks.
     
    , Nov 6, 2005
    #1
    1. Advertising

  2. Guest

    when I test the two program in the same OS,
    i mean from a redhat 9 OS to a redhat 9 OS,
    It's ok. receivefile match sent file.


    But when I run receiver on a Redhat 9,
    and send file from a windows XP,
    the received file's size is randomized.

    May be that's where the problem is.
     
    , Nov 7, 2005
    #2
    1. Advertising

  3. wrote:
    > when I test the two program in the same OS,
    > i mean from a redhat 9 OS to a redhat 9 OS,
    > It's ok. receivefile match sent file.
    >
    >
    > But when I run receiver on a Redhat 9,
    > and send file from a windows XP,
    > the received file's size is randomized.
    >
    > May be that's where the problem is.
    >


    No. Read Jean-Paul's reply.

    --Irmen
     
    Irmen de Jong, Nov 8, 2005
    #3
  4. wrote:

    > while True:
    > data = f.read(8192)
    > if not data: break
    > else:
    > s.send(data)


    > What is the cause of the problem, can anyone tell me?


    using sendall instead of send should fix this. see the library reference for
    details:

    send( string[, flags])
    Send data to the socket. The socket must be connected to a remote
    socket. The optional flags argument has the same meaning as for recv()
    above. Returns the number of bytes sent. Applications are responsible
    for checking that all data has been sent; if only some of the data was
    transmitted, the application needs to attempt delivery of the
    remaining data.

    sendall( string[, flags])

    Send data to the socket. The socket must be connected to a remote
    socket. The optional flags argument has the same meaning as for recv()
    above. Unlike send(), this method continues to send data from string
    until either all data has been sent or an error occurs. None is
    returned on success. On error, an exception is raised, and there is no
    way to determine how much data, if any, was successfully sent.

    </F>
     
    Fredrik Lundh, Nov 8, 2005
    #4
  5. Guest

    Thanks Fredrik Lundh,
    This is great!

    I've rewrote the code and it works!
    Thanks a lot.
     
    , Nov 8, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Florent Coué
    Replies:
    2
    Views:
    6,467
  2. Florent Coué
    Replies:
    0
    Views:
    514
    Florent Coué
    Aug 8, 2003
  3. Digital Puer
    Replies:
    3
    Views:
    458
    Mike Schilling
    Mar 15, 2006
  4. Laszlo Nagy
    Replies:
    1
    Views:
    5,103
    Mark Wooding
    Jan 27, 2009
  5. twgray
    Replies:
    15
    Views:
    3,554
Loading...

Share This Page