Important: The information in this document is obsolete and should not be used for new development.
OTRcvUReply
Reads a reply to a request sent by a client using a connectionless transaction-based protocol.C INTERFACE
OSStatus OTRcvUReply(EndpointRef ref, TUnitReply* reply, OTFlags* replyFlags);C++ INTERFACE
OSStatus TEndpoint::RcvUReply(TUnitReply* reply, OTFlags* replyFlags);PARAMETERS
ref- The endpoint reference of the endpoint accepting the reply.
reply- A pointer to a
TUnitReplystructure that specifies the location to store the reply information.
- The
reply->addrfield specifies the location and size of a buffer containing the address of the endpoint sending the reply. You must allocate a buffer into which the address is placed when the function returns, and you must set thereply->addr.buffield to point to this buffer. You must also set thereply->addr.maxlenfield to the maximum size of the buffer.
- The
reply->optfield specifies the location and size of a buffer containing the association-related options that the responder has sent using theOTSndUReplyfunction. You must allocate a buffer to hold option information and set thereply->optfield to point to it. When theOTRcvUReplyfunction returns, it fills this buffer with option information. You must set thereply->opt.maxlenfield to the maximum size necessary to hold option information.
- The
reply->udatafield specifies the location and size of a buffer into which the function places the reply data on return. You must allocate a buffer to hold the data, set thereply->udata.buffield to point to it, and set thereply->udata.maxlenfield to the maximum size of this buffer. The size must not exceed the value specified for thetsdufield of theTEndpointInfostructure for this endpoint.
- If you have sent out multiple requests, you can use the
reply->sequencefield to match incoming replies to outgoing requests.
replyFlags- A pointer to a bitmapped long that is filled in by the endpoint provider to indicate whether there is more reply data to be read, in which case you must call the
OTRcvUReplyfunction again. A value ofT_MOREindicates that the buffer pointed to byudata.bufis too small to contain the reply. A value ofT_PARTIALDATAindicates that the data unit being read does not contain the complete reply. It is possible that both flags are set.
- function result
- An error code. See Discussion.
DISCUSSION
You use theOTRcvUReplyfunction to read the reply to a request that you have issued using theOTSndURequestfunction. Thereplyparameter points to buffers in which the function stores the reply, the address of the responder, any options connected with this transaction, and the transaction ID for this transaction.If the endpoint is in asynchronous mode, the provider generates a
T_REPLYevent to let you know that reply data has arrived. If it should happen that the reply data is sent using multiple calls to the sending function, Open Transport does not generate additionalT_REPLYevents. To guard against this possibility, your notifier function should call theOTRcvUReplyfunction until it returns thekOTNoDataErrresult.If a transaction has timed out awaiting reply data, the
OTRcvUReplyfunction returns akETIMEDOUTErrresult; thesequencefield of thereplyparameter specifies which request has timed out.If you have issued multiple requests, it is not possible to know ahead of time how incoming replies match your requests. If the
OTRcvUReplyfunction returns withtheT_PARTIALDATAflag set, you must be prepared to receive a reply to any outstanding request. One way to manage this situation is to call theOTRcvUReplyfunction with thereply->udata.maxlenfield set to 0. The rest of the information returned by the function on this first call lets you know the sequence number of the reply as well as theflagPtrsetting. Once you determine the matching request and the appropriate reply buffer, you can call theOTRcvUReplyfunction a second time to read the actual reply data. On the second and subsequent reads, Open Transport sets thereply->opt.lenfield to 0. It is guaranteed that once a reply has been partially read, subsequent calls toOTRcvUReplywill read from that same reply until all the data has been read.If the
T_MOREbit is set in theflagsparameter, this means your buffer is not large enough to hold the entire reply. You must call theOTRcvURequestfunction again to retrieve more request data. Open Transport ignores theaddrandoptfields of thereplyparameter for subsequent calls to the function. TheT_MOREflag is not set for the last reply 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 read with theOTRcvUReplyfunction does not constitute the entire reply; more data is coming but it has not yet arrived. You must call the function again to read more of, or the rest of, the reply.If the
T_MOREand theT_PARTIALDATAbits are both set, this means that the data you read constitutes only part of the reply 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.The following table shows how the endpoint's mode of execution and blocking status affects the behavior of the
OTRcvUReplyfunction.
Blocking Nonblocking Synchronous The function returns when the provider lifts flow-control restrictions and the reply has arrived. The function returns immediately. The kOTFlowErrresult is never returned.The kOTFlowErrresult might be returned.Asynchronous The function returns immediately. The provider calls your notifier, passing
T_REPLYfor thecodeparameter.The function returns immediately. The provider calls your notifier, passing
T_REPLYfor thecodeparameter.The kOTFlowErrresult might be returned.The kOTFlowErrresult might be returned.SEE ALSO
TheOTSndURequestfunction.