Re: Python recv loop

Discussion in 'Python' started by Dave Angel, Feb 11, 2013.

  1. Dave Angel

    Dave Angel Guest

    On 02/10/2013 07:48 PM, Ihsan Junaidi Ibrahim wrote:
    > Hi,
    >
    > I'm implementing a python client connecting to a C-backend server and am currently stuck to as to how to proceed with receiving variable-length byte stream coming in from the server.
    >
    > I have coded the first 4 bytes (in hexadecimal) of message coming in from the server to specify the length of the message payload i.e. 0xad{...}


    Exactly how are you sending "hexadecimal" ? If that 0xad (which is only
    one byte, what about the other 3 ?) is intended to be a C description,
    then it's certainly not hex, it's binary. And probably little-endian,
    to boot. That's a mistake, as network protocols almost always use
    big-endian.

    So what is the range of values for the length, and how are they actually
    encoded? Are they uint32 in native binary format? And are you
    permitted to change the encoding, to fix it? (If it were my choice, I'd
    make it a printable decimal value, first choice, or printable hex,
    second choice.)

    >
    > I've managed to receive and translate the message length until I reach my second recv which I readjusted the buffer size to include the new message length.
    >
    > However that failed and recv received 0 bytes. I implemented the same algorithm on the server side using C and it work so appreciate if you can help me on this.
    >
    > # receive message length
    > print 'receiving data'
    > mlen = sock.recv(4)
    > try:
    > nbuf = int(mlen, 16)


    That supposes the count is being sent as a printable string of hex
    digits. That's not what I concluded above.

    > except ValueError as e:


    If the count starts as 0xad, I can't imagine why this exception wasn't
    thrown.

    > print 'invalid length type'
    > return -1
    >
    > while True:
    > buf = sock.recv(nbuf)
    >
    > if not buf:
    > break
    >
    > slen = len(buf)
    > str = "{0} bytes received: {1}".format(slen, buf)
    > print str
    >


    You might need to play with hexlify, if you persist in sending the count
    in binary.

    --
    DaveA
    Dave Angel, Feb 11, 2013
    #1
    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. deepak nayak
    Replies:
    3
    Views:
    413
    =?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=
    Oct 25, 2007
  2. Ihsan Junaidi Ibrahim

    Python recv loop

    Ihsan Junaidi Ibrahim, Feb 11, 2013, in forum: Python
    Replies:
    7
    Views:
    155
  3. MRAB

    Re: Python recv loop

    MRAB, Feb 11, 2013, in forum: Python
    Replies:
    0
    Views:
    106
  4. Ihsan Junaidi Ibrahim

    Re: Python recv loop

    Ihsan Junaidi Ibrahim, Feb 11, 2013, in forum: Python
    Replies:
    0
    Views:
    101
    Ihsan Junaidi Ibrahim
    Feb 11, 2013
  5. Isaac Won
    Replies:
    9
    Views:
    352
    Ulrich Eckhardt
    Mar 4, 2013
Loading...

Share This Page