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
TUnitRequeststructure that contains information about the request being received.
- The
req->addrfield specifies the location and size of a buffer containing the address of the endpoint that made the request; the field is filled in by theOTRcvURequestfunction when it returns. You must allocate a buffer to hold address information and set thereq->addr.buffield to point to it. You must also set thereq->addr.maxlenfield to the maximum size of the address.
- The
req->optfield specifies the location and size of a buffer containing the association-related options specified by the requester. Otherwise, this buffer is empty. When theOTRcvURequestfunction returns, it places option information in this buffer. You must allocate a buffer to contain the option information and set thereq->opt.buffield to point to this buffer. You must set thereq->opt.maxlenfield to the maximum size necessary to hold option information for the endpoint.
- The
req->udatafield specifies the location and size of a buffer containing the request. You must allocate a buffer into which theOTRcvURequestfunction can place the request and set thereq->udata.buffield to point to it. You must set thereq->udata.maxlenfield to the maximum size of the request data.
- The value of the
req->sequencefield is generated by the endpoint provider when you read the request. You need to save this value and use it for thereq->sequencefield 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_MOREindicates that the buffer you have allocatedis too small to contain the reply. A value ofT_PARTIALDATAindicates 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 theOTRcvURequestfunction to read an incoming request. When the function returns, it fills in theTUnitRequeststructure (referenced by thereqparameter) 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 thekOTBufferOverflowErrresult and the incoming request is dropped.If the endpoint is in synchronous mode and is blocking, the
OTRcvURequestfunction waits for a request to arrive. If the endpoint is in asynchronous mode or is not blocking, theOTRcvURequestfunction retrieves the next pending unread request or returns thekOTNoDataErrresult if there are no pending requests.If the endpoint is in asynchronous mode, the endpoint provider generates a
T_REQUESTevent when a request arrives. You can poll the endpoint using theOTLookfunction or use a notifier function to retrieve this event. You should then call the funtion to retrieve request data until the function returns with thekOTNoDataErrresult.If the
T_MOREbit is set in theflagsparameter, this means your buffer is not large enough to hold the entire request. You must call theOTRcvURequestfunction again to retrieve more request data. Open Transport ignores theaddrandoptfields of thereqparameter for subsequent calls to theOTRcvURequestfunction. TheT_MOREflag is not set for the last request packet to let you know that this is the last packet.If the
T_PARTIALDATAbit is set in theflagsparameter, this means that the data you are about to read with theOTRcvURequestfunction 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_MOREand theT_PARTIALDATAbits 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_MOREflag is clear. TheT_PARTIALDATAbit is set only on the first call to the function.If you are communicating with multiple requesters and the
OTRcvURequestfunction returns with theT_PARTIALDATAflag set, it is possible that your next call to theOTRcvURequestfunction 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 theOTRcvURequestfunction to determine the sequence number of the incoming request (by settingreq->udata.lento 0) and then, having determined which request data is coming in, read the data into the appropriate buffer.The provider sets the
T_ACKNOWLEDGEDflag if the requester has set this flag when calling theOTSndURequestfunction. When this flag is set and you call theOTSndUReplyfunction, Open Transport guarantees that your reply is acknowledged by the requester. This flag is set only on the first call to theOTRcvURequestfunction for any given transaction.SEE ALSO
TheOTSndUReplyfunction.