1

I want to send a data request over udp using the socket API. The format of the request is as follows:

ID | Data_Length | Data

The request contains the following parameters :An Identifier (ID), (Data_Length) is the size of (Data) and (Data) which is the data to be sent, (Data) has a variable size.

The code I wrote is as follows:

def send_request():
    request_format="bbs" # 1 Byte for the ID 1 Byte for Data_Length and s for data
    data_buff=np.array([1,2,3,4,5,6,7,8,9]) # Data to be sent
    msg = struct.pack(request_format,0x01,0x09,data_buff.tobytes())
    print("msg = ", msg)
    s0.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s0.sendto(msg, (UDP_BC_IP, UDP_SERVER_PORT))    

My questions:

1- Using Wireshark I can see that only the 1st Byte of Data has been sent why ?enter image description here

2- The output of the print instruction is msg = b'\x01\t\x01' why did I get this output, I was waiting for something similar to [0x01,0x09,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09]

0

1 Answer 1

1

Check the dtype of data_buff - it is int64 unless you use:

data_buff = np.array([1,2,3,4,5,6,7,8,9], dtype=np.uint8)

Then repeat your s specifier according to the size of the array:

request_format="bb" + str(data_buff.size) + "s"

Now you can pack with:

msg = struct.pack(request_format,0x01,0x09,data_buff.tobytes())

and your message will look like this:

b'\x01\t\x01\x02\x03\x04\x05\x06\x07\x08\t'

The TAB character is ASCII code 9, so you will see \t where your data is 9.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.