RECV returns the length of the incoming message or data. If a datagram packet is too long to fit in the supplied buffer, datagram sockets discard extra bytes.
For stream sockets, the data is processed like streams of information with no boundaries separating data. For example, if applications A and B are connected with a stream socket and Application A sends 1000 bytes, each call to RECV can return 1 byte, or 10 bytes, or the entire 1000 bytes. Therefore, applications using stream sockets should place RECV in a loop that repeats the call until all data has been received.
| Authorization: | Supervisor state or problem state, any PSW key. |
| Dispatchable unit mode: | Task. |
| Cross memory mode: | PASN = HASN. |
| Amode: | 31-bit or 24-bit. Note: See "Addressability
mode (Amode) considerations" under CALL instruction API environmental restrictions and programming requirements.
|
| ASC mode: | Primary address space control (ASC) mode. |
| Interrupt status: | Enabled for interrupts. |
| Locks: | Unlocked. |
| Control parameters: | All parameters must be addressable by the caller and in the primary address space. |
>>-EZASMI--TYPE=RECV--,S--=--+-number---+-----------------------> +-address--+ +-*indaddr-+ '-(reg)----' >--,NBYTE--=--+-number---+--,BUF--=--+-address--+---------------> +-address--+ +-*indaddr-+ +-*indaddr-+ '-(reg)----' '-(reg)----' >--+------------------------+--,ERRNO--=--+-address--+----------> '-,ALET--=--+-address--+-' +-*indaddr-+ +-*indaddr-+ '-(reg)----' '-(reg)----' >--,RETCODE--=--+-address--+------------------------------------> +-*indaddr-+ '-(reg)----' >--+------------------------------+-----------------------------> '-,FLAGS--=--+-'MSG_OOB'-----+-' +-'MSG_PEEK'----+ +-'MSG_WAITALL'-+ +-address-------+ +-*indaddr------+ '-(reg)---------' >--+---------------------------+--+-------------------------+---> +-,ECB--=--+-address--+-----+ '-,ERROR--=--+-address--+-' | +-*indaddr-+ | +-*indaddr-+ | '-(reg)----' | '-(reg)----' '-,REQAREA--=--+-address--+-' +-*indaddr-+ '-(reg)----' >--+------------------------+---------------------------------->< '-,TASK--=--+-address--+-' +-*indaddr-+ '-(reg)----'
If a nonzero ALET is specified, the ALET must represent a valid entry in the dispatchable unit access list (DU-AL) for the task issuing this call. Note that ALETs can be specified only for synchronous socket calls (for example, ECB/REQAREA cannot be specified). An exception to this is an ALET representing a SCOPE=COMMON data space.
| Literal Value | Binary Value | Description |
|---|---|---|
| 'MSG_OOB' | X'00000001' | Receive out-of-band data (stream sockets only). Out-of-band data can be read if the SO_OOBINLINE option is set for the socket regardless of whether the MSG_OOB flag is set. |
| 'MSG_PEEK' | X'00000002' | Peek at the data, but do not destroy the data. If the peek flag is set, the next receive operation reads the same data. |
| 'MSG_WAITALL' | X'00000040' | Requests that the function block until the full amount of requested data can be returned (stream sockets only). The function might return a smaller amount of data if the connection is terminated, if an error is pending, or if the SO_RCVTIMEO field is set and the timer expired for the socket. |
If data is not available for the socket and the socket is in blocking mode, the RECV macro blocks the caller until data arrives. If data is not available and the socket is in nonblocking mode, RECV returns a -1 and sets ERRNO to 35 (EWOULDBLOCK). See FCNTL or IOCTL for a description of how to set nonblocking mode.