#include <sys/types.h> #include <sys/socket.h> int sendmsg(int socket_descriptor, struct msghdr *message_structure, int flags)
#define _XOPEN_SOURCE 520 #include <sys/socket.h> ssize_t sendmsg(int socket_descriptor, const struct msghdr *message_structure, int flags)
The sendmsg() function is used to send data or descriptors or ancillary data or a combination of these through a connected or unconnected socket.
There are two versions of the API, as shown above. The base i5/OS API uses BSD 4.3 structures and syntax. The other uses syntax and structures compatible with the UNIX 98 programming interface specifications. You can select the UNIX 98 compatible interface with the _XOPEN_SOURCE macro.
The BSD 4.3 structure is:
struct msghdr { caddr_t msg_name; int msg_namelen; struct iovec *msg_iov; int msg_iovlen; caddr_t msg_accrights; int msg_accrightslen; };
The BSD 4.4/UNIX 98 compatible structure is:
struct msghdr { void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; int msg_iovlen; void *msg_control; /* Set to NULL if not needed */ socklen_t msg_controllen; /* Set to 0 if not needed */ int msg_flags; };
The msg_name and msg_namelen fields contain the address and address length to which the message is sent. For further information on the structure of socket addresses, see Sockets Programming in the iSeries Information Center. If the msg_name field is set to a NULL pointer, the address information is not returned.
The msg_iov and msg_iovlen fields are for scatter/gather I/O.
The BSD 4.3 structure uses the msg_accrights and msg_accrightslen fields to pass descriptors. The msg_accrights field is a list of zero or more descriptors, and msg_accrightslen is the total length (in bytes) of the descriptor list.
The BSD 4.4/UNIX 98 compatible structure uses the msg_control and msg_controllen fields to pass ancillary data. The msg_control field is a pointer to ancillary data (of length msg_controllen) with the form:
struct cmsghdr { socklen_t cmsg_len; /* # bytes, including this header */ int cmsg_level; /* originating protocol */ int cmsg_type; /* protocol-specific type */ /* followed by unsigned char cmsg_data[]; */ };
The cmsg_len field is the total length including this header. cmsg_level is the originating protocol. cmsg_type is the protocol-specific type. If ancillary data is not being passed, the msg_control field must be initalized to NULL and the msg_controllen field must be initialized to 0. The following tables list the supported ancillary data types when using the BSD 4.4/UNIX 98 compatible structures.
Ancillary Data Types That Apply to the Socket Layer (where cmsg_level is SOL_SOCKET ):
cmsg_type | cmsg_data |
---|---|
SCM_RIGHTS | The rest of the buffer is a
list of zero or more descriptors to be sent.
This ancillary data type is only supported for sockets with an address family of AF_UNIX or AF_UNIX_CCSID. |
Ancillary Data Types That Apply to the IP Layer (where cmsg_level is IPPROTO_IP):
cmsg_type | cmsg_data |
---|---|
IP_QOS_CLASSIFICATION_DATA | The rest of the buffer is an
ip_qos_classification_data structure.
This structure is defined in <netinet/ip.h>.
For further information on the how this structure should be initialized,
see Quality of Service in the
iSeries Information Center.
This ancillary data type is only supported for sockets with an address family of AF_INET and a type of SOCK_STREAM. |
Macros are provided for navigating these structures.
The BSD 4.4/UNIX 98 msg_flags field is ignored for sendmsg().
MSG_EOR | Terminate a record, if supported by the
protocol. |
MSG_OOB | Send data as out-of-band data. Valid only for
sockets with an address family of AF_INET or AF_INET6
and type SOCK_STREAM. |
MSG_DONTROUTE | Bypass routing. Valid only for sockets with address family of AF_INET. It is ignored for other address families. |
When the address family of the socket identified by the socket_descriptor is AF_INET and is running IP over SNA, the thread must have retrieve, insert, delete, and update authority to the APPC device. When the thread does not have this level of authority, an errno of EACCES is returned.
sendmsg() returns an integer. Possible values are:
When sendmsg() fails, errno can be set to one of the following:
[EACCES] | Permission denied.
The process does not have the appropriate privileges to the destination address. |
[EADDRNOTAVAIL] | Address not available.
A socket with an address family of AF_INET or AF_INET6 is using a connectionless transport service, the socket was not bound. The system tried to bind the socket but could not because a port was not available. |
[EBADF] | Descriptor not valid. |
[ECONNREFUSED] | The destination socket refused an attempted
connect operation.
This error code can only be returned on sockets that use a connectionless transport service. |
[EDESTADDRREQ] | Operation requires destination address.
A destination address has not been associated with the socket pointed to by the socket_descriptor parameter and a destination address was not set in the msghdr structure (pointed to by the message_structure parameter). This error code can only be returned on sockets that use a connectionless transport service. |
[EFAULT] | Bad address.
The system detected an address which was not valid while attempting to access the message_structure parameter or a field within the structure pointed to by the message_structure parameter. |
[EHOSTDOWN] | A remote host is not available.
This error code can only be returned on sockets that use a connectionless transport service. |
[EHOSTUNREACH] | A route to the remote host is not available.
This error code can only be returned on sockets that use a connectionless transport service. |
[EINTR] | Interrupted function call. |
[EINVAL] | Parameter not valid.
This error code indicates one of the following:
|
[EIO] | Input/output error. |
[EISCONN] | A connection has already been established.
A destination address was set, but the socket pointed to by the socket_descriptor parameter already has a destination address associated with it. |
[ELOOP] | A loop exists in symbolic links encountered
during pathname resolution.
This error code refers to the destination address, and can only be returned by sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[EMSGSIZE] | Message size out of range.
This error code indicates one of the following:
|
[ENAMETOOLONG] | File name too long.
This error code refers to the destination address, and can only be returned by sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENETDOWN] | The network is not currently available.
This error code can only be returned on sockets that use a connectionless transport service. |
[ENETUNREACH] | Cannot reach the destination network.
This error code can only be returned on sockets that use a connectionless transport service. |
[ENOBUFS] | There is not enough buffer space for the requested operation. |
[ENOENT] | No such file or directory.
This error code refers to the destination address, and can only be returned by sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENOSYS] | Function not implemented.
This error code refers to the destination address, and can only be returned by sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENOTCONN] | Requested operation requires a connection.
This error code can only be returned on sockets that use a connection-oriented transport service. |
[ENOTDIR] | Not a directory.
This error code refers to the destination address, and can only be returned by sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENOTSOCK] | The specified descriptor does not reference a
socket. |
[EOPNOTSUPP] | Operation not supported.
This error code indicates one of the following:
|
[EPIPE] | Broken pipe. |
[EUNATCH] | The protocol required to support the specified
address family is not available at this time. |
[EUNKNOWN] | Unknown system state. |
[EWOULDBLOCK] | Operation would have caused the thread to be suspended. |
Message ID | Error Message Text |
---|---|
CPE3418 E | Possible APAR condition or hardware failure. |
CPF9872 E | Program or service program &1 in library &2 ended. Reason code &3. |
CPFA081 E | Unable to set return value or error code. |
Note: The msg_name and msg_namelen fields are ignored if the socket is using a connection-oriented transport service.
Top | UNIX-Type APIs | APIs by category |