With a socket created, and a message sent, the next step in our networking journey is to receive data.
Note that I used this post to get the parameter right. Without using the ctypes pointer function I got an address error.
print("calling recvfrom")
recv_sockaddr_mctp = struct_sockaddr_mctp(AF_MCTP, 0, mctp_addr , 0, 0)
len = 2000;
rxbuf = create_string_buffer(len)
sock_addr_sz = c_int(sizeof(recv_sockaddr_mctp))
MSG_TRUNC = 0x20
rc = libc.recvfrom(sock, rxbuf, len, MSG_TRUNC, byref(recv_sockaddr_mctp), pointer(sock_addr_sz));
errno = get_errno_loc()[0]
if (rc < 0 ):
print("rc = %d errno = %d" % (rc, errno))
exit(rc)
print(rxbuf.value)
From previous articles you might be wondering about these values.
AF_MCTP = 45
mctp_addr = struct_mctp_addr(0x32)
However, the real magic is the structures defined using ctypesgen. I recommend reading the previous article for the details.
While the previous two article are based on the code connect example that I adjusted and posted here, the recvfrom code is an additional call. The c code it is based on looks like this:
addrlen = sizeof(addr);
rc = recvfrom(sd, rxbuf, len, MSG_TRUNC,
(struct sockaddr *)&addr, &addrlen);