Mouin
Mouin

Reputation: 1103

Send UDP Datagrams using Python

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]

Upvotes: 1

Views: 136

Answers (1)

Mark Setchell
Mark Setchell

Reputation: 207660

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.

Upvotes: 1

Related Questions