OTSnd
Sends data to a remote peer.C INTERFACE
OTResult OTSnd (EndpointRef ref, void* buf, size_t nbytes, OTFlags flags);C++ INTERFACE
OTResult TEndpoint::Snd(void* buf, size_t nbytes, OTFlags flags);PARAMETERS
ref- The endpoint reference of the endpoint sending data.
buf- A pointer to the data being sent. If you are sending data that is not stored contiguously, this is a pointer to an
OTDatastructure that describes the first data fragment.nbytes- A long specifying the number of bytes being sent. If you are sending data that is not stored contiguously, you must set this field to the
kNetbufDataIsOTDataconstant.flags- A long bitmapped variable specifying whether the data to be sent is expedited (
T_EXPEDITED) and whether more data remains to be sent (T_MORE). To set both fields, use thebitANDoperator.DESCRIPTION
You use theOTSndfunction to send data to a remote peer. Before you use this function, you must establish a connection with the peer.If the
OTSndfunction succeeds, it returns an integer (OSStatus) specifying the number of bytes that were actually sent. If it fails, it returns a negative integer corresponding to a result code that indicates the reason for the failure.You specify the data to be sent by passing a pointer to the data (
buf) and by specifying the size of the data (nbytes). The maximum size of the data you can send is specified by thetsdufield of theTEndpointInfostructure for the endpoint.Some protocols use expedited data for control or attention messages. To determine whether the endpoint supports this service, examine the
etsdufield of theTEndpointInfostructure. A positive integer for theetsdufield indicates the maximum size in bytes of expedited data that you can send. To send expedited data, you must set theT_EXPEDITEDbit of theflagsparameter.If you want to break up the data sent into smaller logical units, you can set the
T_MOREbit of theflagsparameter to indicate that you are using additional calls to theOTSndfunction to send more data that belongs to the same logical unit.
To indicate that the last data unit is being sent, you must specify 0 fornbytesand turn off theT_MOREflag. This is the only circumstance under which it is permitted to send a zero-length data unit. If the endpoint does not support
the sending of zero-length data, theOTSndfunction fails with thekOTBadDataErrresult.If the endpoint is in blocking mode, the
OTSndfunction returns after it actually sends the data. If flow-control restrictions prevent its sending the data, it retries the operation until it is able to send it. If the endpoint is in nonblocking mode, theOTSndfunction returns with thekOTFlowErrresult if flow-control restrictions prevent the data from being sent. When the endpoint provider is able to send the data, it returns aT_GODATAevent to let you know that it is possible to
send data.If the endpoint is in non-blocking or asynchronous mode, it is possible that only part of the data is actually accepted by the transport provider. In this case, the
OTSndfunction returns a value that is less than the value of thenbytesparameter, or the errorkOTFlowErrif no bytes at all were sent. After this error occurs, aT_GODATAevent will be issued when the flow control restrictions are lifted. This error is not returned if the endpoint is in blocking mode.If an asynchronous event, such as a disconnect, occurs and interrupts the
OTSndfunction,OTSndreturns with thekOTLookErrresult.The following table shows how the endpoint's mode of execution and blocking status affects the behavior of the
OTSndfunction.
Blocking Nonblocking Synchronous The function returns when the provider lifts flow-control restrictions. The function returns immediately. The kOTFlowErrresult is never returned.The kOTFlowErrresult might be returned.Asynchronous The function returns immediately. The function returns immediately. The kOTFlowErrresult is never returned.The kOTFlowErrresult might be returned.SPECIAL CONSIDERATIONS
TheXTI_SNDLOWAToption allows endpoints that support it to negotiate the minimum number of bytes that must have accumulated in the endpoint's internal send buffer before they are sent. If the endpoint you are using supports this option, you can negotiate a value using theOTOptionManagementfunction. Because you use theOTOptionManagementfunction to set this option, it affects all subsequent sends.VALID STATES
T_DATAXFER,T_INRELSEE ALSO
For information about transferring data, see "Using Connection-Oriented Transactionless Service," beginning on page 3-36.You can examine the
TEndpointInfostructure (page 3-48) to find out what kind of data you can send and its maximum size.You use the
OTDatastructure (page 3-52) to transfer noncontiguous data.For information on how to use this function with a TCP/IP protocol, see page 8-18 in the TCP/IP chapter.
For information on how to use this function with AppleTalk protocols, see page 13-11 in the ADSP chapter and page 15-10 in the PAP chapter.
For additional information about the
OTOptionManagementfunction, see the chapter "Option Management" in this book.