Sid
Sid

Reputation: 4055

How to check if socket connection is working and buffering or is the request incorrect?

I have been trying to figure this out and can't seem to wrap my head around it.

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server = '192.168.1.7'
port = 8000
buffer_size = 4096


request = '1|gkdgdfg49|sdfsdfsd*|sdsfsf*|'+server
request = request.encode()
s.connect((server,port))

s.send(request)
x = s.recv(buffer_size)

The documentation for the server side is:

https://www.sharekhan.com/Upload/General/TradeTigerAPIForClient.pdf

The log of api server shows:

[I]  "API Client Socket Connected with error Code=0"2018-09-22                               16:07:23.555+05:30  
[I]  "Hurraay You have Connected."2018-09-22 16:07:23.555+05:30  
[I]  "Received Bytes Count = 49 Data Length = 1801944113 Thread State = Background, WaitSleepJoin , Queue Count = 0"2018-09-22 16:07:23.555+05:30  
[I]  "API Client Request Data Length 1801944113 bytes needs to read"
     2018-09-22 16:08:21.984+05:30  
[I]  "Received Bytes Count = 49 Data Length = 1801944113 Thread State =        Background, WaitSleepJoin , Queue Count = 0"
  2018-09-22 16:08:21.984+05:30  
[I]  "API Client Request Data Length 1801944113 bytes needs to read"|Reserved = |

Is the request correct? Is the data being transferred?

If I rerun

s.send(request)
x = s.recv(buffer_size)

Nothing happens. The interpreter is stuck at running the above two lines.

I would appreciate any help. Very new to `sockets and the documentation is not very helpful.

Upvotes: 0

Views: 168

Answers (1)

Gil Hamilton
Gil Hamilton

Reputation: 12357

As I pointed out in your other question, this is a binary protocol.

You're sending it ASCII text. Note that big number (1801944113), when interpreted as text, is equal to 'kg|1'. This is (the big-endian ordering of) the first four characters you sent it. In other words, it's taken the first four bytes you sent it, interpreted them as a binary value, and is now using it as the message length value -- which is obviously all wrong.

You need to use the python struct module's pack and unpack methods to encode and decode binary values to build up your buffer.

That would look something like this:

import struct

trans_code = 1 # LOGIN
login_id = b'MyName'
mpassword = b'MyPass'
tpassword = b'MyTradingPass'
my_ip = b'192.168.1.31'      # No idea what the point of this is
reserved = b''

msg_length = 196
msg_buffer = struct.pack("!IH30s20s20s20s100s", msg_length, trans_code,
                         login_id, mpassword, tpassword, my_ip, reserved)
assert len(msg_buffer) == msg_length

print("Login request to send '{}'".format(msg_buffer))

You will need to learn to use the struct module. It's well-specified in the python documentation.

Your results (in particular that big number) establish that the server is expecting numeric fields to be encoded in big-endian byte order (AKA "network byte order").

Upvotes: 2

Related Questions