Important: The information in this document is obsolete and should not be used for new development.
OTRcvURequest
Reads a request sent by a client using a connectionless transaction-based protocol.C INTERFACE
OSStatus OTRcvURequest(EndpointRef ref, TUnitRequest* req, OTFlags* reqFlags);C++ INTERFACE
OSStatus TEndpoint::RcvURequest(TUnitRequest* req, OTFlags* reqFlags);PARAMETERS
ref
- The endpoint reference of the endpoint accepting the request.
req
- A pointer to a
TUnitRequest
structure that contains information about the request being received.
- The
req->addr
field specifies the location and size of a buffer containing the address of the endpoint that made the request; the field is filled in by theOTRcvURequest
function when it returns. You must allocate a buffer to hold address information and set thereq->addr.buf
field to point to it. You must also set thereq->addr.maxlen
field to the maximum size of the address.
- The
req->opt
field specifies the location and size of a buffer containing the association-related options specified by the requester. Otherwise, this buffer is empty. When theOTRcvURequest
function returns, it places option information in this buffer. You must allocate a buffer to contain the option information and set thereq->opt.buf
field to point to this buffer. You must set thereq->opt.maxlen
field to the maximum size necessary to hold option information for the endpoint.
- The
req->udata
field specifies the location and size of a buffer containing the request. You must allocate a buffer into which theOTRcvURequest
function can place the request and set thereq->udata.buf
field to point to it. You must set thereq->udata.maxlen
field to the maximum size of the request data.
- The value of the
req->sequence
field is generated by the endpoint provider when you read the request. You need to save this value and use it for thereq->sequence
field when sending a reply or cancelling the transaction.
reqFlags
- A bitmapped 32-bit value set by the endpoint provider that specifies whether the request is acknowledged (
T_ACKNOWLEDGED
) and whether there is more request data coming (T_MORE
) or(T_PARTIALDATA)
. A value ofT_MORE
indicates that the buffer you have allocatedis too small to contain the reply. A value of
T_PARTIALDATA
indicates that the data unit being read does not contain the complete request. It is possible that all flags are set.
- function result
- An error code. See Discussion.
DISCUSSION
You use theOTRcvURequest
function to read an incoming request. When the function returns, it fills in theTUnitRequest
structure (referenced by thereq
parameter) with the address of the sender, the request data, and any association-related options pertaining to this request. If the buffer you allocated for the address is not big enough, the function returns with thekOTBufferOverflowErr
result and the incoming request is dropped.If the endpoint is in synchronous mode and is blocking, the
OTRcvURequest
function waits for a request to arrive. If the endpoint is in asynchronous mode or is not blocking, theOTRcvURequest
function retrieves the next pending unread request or returns thekOTNoDataErr
result if there are no pending requests.If the endpoint is in asynchronous mode, the endpoint provider generates a
T_REQUEST
event when a request arrives. You can poll the endpoint using theOTLook
function or use a notifier function to retrieve this event. You should then call the funtion to retrieve request data until the function returns with thekOTNoDataErr
result.If the
T_MORE
bit is set in theflags
parameter, this means your buffer is not large enough to hold the entire request. You must call theOTRcvURequest
function again to retrieve more request data. Open Transport ignores theaddr
andopt
fields of thereq
parameter for subsequent calls to theOTRcvURequest
function. TheT_MORE
flag is not set for the last request packet to let you know that this is the last packet.If the
T_PARTIALDATA
bit is set in theflags
parameter, this means that the data you are about to read with theOTRcvURequest
function does not constitute the entire request and that you must call the function again to read more of or the rest of the request.If the
T_MORE
and theT_PARTIALDATA
bits are both set, this means that the data you are about to read constitutes only part of the request and that your buffer is too small to contain even this chunk. In this case, you must call the function again until theT_MORE
flag is clear. TheT_PARTIALDATA
bit is set only on the first call to the function.If you are communicating with multiple requesters and the
OTRcvURequest
function returns with theT_PARTIALDATA
flag set, it is possible that your next call to theOTRcvURequest
function might not read the rest of the request because the next data unit coming in belongs to a different request. One way to handle this situation is to use the next call to theOTRcvURequest
function to determine the sequence number of the incoming request (by settingreq->udata.len
to 0) and then, having determined which request data is coming in, read the data into the appropriate buffer.The provider sets the
T_ACKNOWLEDGED
flag if the requester has set this flag when calling theOTSndURequest
function. When this flag is set and you call theOTSndUReply
function, Open Transport guarantees that your reply is acknowledged by the requester. This flag is set only on the first call to theOTRcvURequest
function for any given transaction.SEE ALSO
TheOTSndUReply
function.