QsoStartSend()--Start Asynchronous Send Operation


  Syntax
 #include <qsoasync.h>

 int QsoStartSend (int socketDescriptor, int IOCompletionPort,
 Qso_OverlappedIO_t * communicationsArea)

        

  Service Program Name: QSOSRV3

  Default Public Authority: *USE

  Threadsafe: Yes

The QsoStartSend function is used to initiate a asynchronous send operation. The supplied buffer cannot be reused by the calling application until the send is complete or the I/O completion port specified on the QsoStartSend has been destroyed. This API only supports sockets with an address family of AF_INET or AF_INET6 and type SOCK_STREAM.


Parameters

int socketDescriptor (Input)
The socket descriptor on which the data should be sent.

int IOCompletionPort(Input)
The I/O completion port that should be posted when the operation completes.

Qso_OverlappedIO_t * communicationsArea (Input/Output)
A pointer to a structure that contains the following information:

descriptorHandle (Input) - The descriptor handle is application specific and is never used by the system. This field is intended to make it easier for the application to keep track of information regarding a given socket connection.
buffer (Input) - A pointer to a buffer of data that should be sent over the socket.
bufferLength (Input) - The length of the data to be sent.
postFlag (Input) - The postFlag indicates if this operation should be posted to the I/O completion port even if it completes immediately.
  • A 0 value indicates that if the operation is already complete upon return to the application, then do not post to the I/O completion port.
  • A 1 value indicates that even if the operation completes immediately upon return to the application, the result should still be posted to the I/O completion port.
postFlagResult (Output) - This field is valid if QsoStartSend() returns with 1 and postFlag was set to 1. In this scenario, postFlagResult set to 1 denotes the operation completed and been posted to the I/O completion port specified. A value of 0 denotes the operation could not be completed immediately, but will be handled asynchronously.
fillBuffer (Input) - Only used on QsoStartRecv(). Ignored on QsoStartSend().
returnValue (Output) - When QsoStartSend() completes synchronously (function return value equals 0), then this field indicates the number of bytes that was actually sent. When the send operation completes asynchronously, this filed contains indication of success or failure.
errnoValue (Output) - When the operation completes asynchronously and returnValue is negative, this field will contain an errno to indicate the error with which the operation eventually failed.
operationCompleted (Output) - If the operation is posted to the I/O completion port, this field is updated to indicate that the operation was a QsoStartSend().
secureDataTransferSize Not used.
bytesAvailable Not used.
operationWaitTime (Input) - A timeval structure which specifies the maximum time allowed for this operation to complete asynchronously.
           struct timeval {
                           long  tv_sec;   /* second          */
                           long  tv_usec;  /* microseconds    */
           };
                    

If this timer expires, the operation will be posted to the I/O completion port with errnoValue set to EAGAIN.

If this field is set to zero, the operation's asynchronous completion will not be timed.

If socketDescriptor is closed before the operation completes or times out, the operation will be posted to the I/O completion port with errnoValue set to ECLOSED.

The minimum operationWaitTime is 1 second. The microseconds field (tv_usec) in the timeval is not used and must be set to zero.

postedDescriptor Not used - Must be set to zero.
operationId (Input) - An identifier to uniquely identify this operation or a group of operations. It can be set with the return value from QsoGenerateOperationId() or with an application-defined value.
This value is preserved but ignored by all APIs except QsoCancelOperation() and QsoIsOperationPending().
reserved1 (Input) - Must be set to hex zeroes.
reserved2 (Input) - Must be set to hex zeroes.

Authorities

No authorization is required.


Return Values

QsoStartSend() returns an integer. Possible values are:


Errno Conditions

When QsoStartSend() fails, errno can be set to one of the following:

[EINVAL] A buffer length or I/O completion port or reserved field specified was not valid or postedDescriptor was not zero or operationWaitTime.tv_sec was negative or operationWaitTime.tv_usec was not zero.

Note: The rest of the errno values from send() also apply to QsoStartSend().


Error Messages

Message ID Error Message Text
CPFA081 E Unable to set return value or error code.
CPE3418 E Possible APAR condition or hardware failure.
CPF9872 E Program or service program &1 in library &2 ended. Reason code &3.


Usage Notes

  1. It is important for application programmers to keep in mind that since QsoStartSend() is asynchronous, care should be used to control how many of these functions are outstanding. When a TCP socket becomes flow control blocked such that the QsoStartSend() is not able to pass the data to the TCP socket immediately, the return value will be 1. Applications that send large amounts of data should have the postFlag set to 0. This allows the application to use a return value of 1 as an indication that the socket has become flow control blocked. The application should then wait for the outstanding operation to complete before issuing another QsoStartSend(). This will ensure that the application does not exhaust system buffer resources.

  2. A buffer that is given to QsoStartSend() must not be used by the application again until either it is returned by QsoWaitForIOCompletion() or is reclaimed by issuing a close() on the socket descriptor or issuing a QsoDestroyIOCompletionPort() on the I/O completion port. If a buffer is given to QsoStartSend() to be sent, and it is later detected during QsoStartSend() processing that the buffer has been freed, it may produce an unrecoverable condition on the socket for which the QsoStartSend() was issued. If this occurs, an ECONNABORTED error value will be returned.

  3. It is not recommended to intermix QsoStartSend() and blocking I/O (that is, send()) on the same socket. If one does, then the pending asynchronous send I/O will be serviced before blocking I/O once data can be sent.

  4. Socket option SO_SNDTIMEO is not supported by this API. Semantics similar to SO_SNDTIMEO can be obtained using the operationWaitTime field in the Qso_OverLappedIO_t structure.

Related Information



API introduced: V5R1

[ Back to top | UNIX-Type APIs | APIs by category ]