Read data from a socket.


#include <zircon/syscalls.h>

zx_status_t zx_socket_read(zx_handle_t handle,
                           uint32_t options,
                           void* buffer,
                           size_t buffer_size,
                           size_t* actual);


zx_socket_read() attempts to read buffer_size bytes into buffer. If successful, the number of bytes actually read are return via actual.

If a NULL actual is passed in, it will be ignored.

If the socket was created with ZX_SOCKET_DATAGRAM, this syscall reads only the first available datagram in the socket (if one is present). If buffer is too small for the datagram, then the read will be truncated, and any remaining bytes in the datagram will be discarded.

Supported options are:

  • ZX_SOCKET_PEEK to leave the message in the socket.

To determine how many bytes are available to read, use the rx_buf_available field of the resulting zx_info_socket_t, which you can obtain using the ZX_INFO_SOCKET topic for zx_object_get_info().


handle must be of type ZX_OBJ_TYPE_SOCKET and have ZX_RIGHT_READ.


zx_socket_read() returns ZX_OK on success, and writes into actual (if non-NULL) the exact number of bytes read.


ZX_ERR_BAD_HANDLE handle is not a valid handle.

ZX_ERR_BAD_STATE reading has been disabled for this socket endpoint via zx_socket_shutdown().

ZX_ERR_WRONG_TYPE handle is not a socket handle.

ZX_ERR_INVALID_ARGS If any of buffer or actual are non-NULL but invalid pointers, or if buffer is NULL, or if options is zero.

ZX_ERR_ACCESS_DENIED handle does not have ZX_RIGHT_READ.

ZX_ERR_SHOULD_WAIT The socket contained no data to read.

ZX_ERR_PEER_CLOSED The other side of the socket is closed and no data is readable.