Hi Dave, On Feb 11, 2013, at 9:22 AM, Dave Angel <da...@davea.name> wrote:
> 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.) They are ASCII stream, actually JSON with the exception of the first 4 bytes. I avoided using struct class for this as it's overkill for my application. So the idea is that i code the length to a max of 0xff (max length of 256 bytes), I would only have to assign 4 bytes to it. If i need 1k length, i just need to increase it to 6 bytes or 4 if i decide to strip the 0x. the code for the function is as follows: def request_get_session(sock, jmsg): # append message length plen = hex(len(jmsg)) msg = '{0}{1}'.format(plen, jmsg) print 'sending data' n = sock.send(msg) str = '{0} bytes sent: {1}'.format(n, msg) print str # receive message length print 'receiving data' mlen = sock.recv(4) try: nbuf = int(mlen, 16) except ValueError as e: print 'invalid length type' return -1 print 'message length is {0}'.format(nbuf) while True: buf = sock.recv(nbuf) if not buf: break slen = len(buf) str = "{0} bytes received: {1}".format(slen, buf) print str return 0 > >> >> 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. That is what I meant. it just an ascii string. -- http://mail.python.org/mailman/listinfo/python-list