BSD 4.3 Syntax
#include <sys/types.h> #include <sys/socket.h> int bind(int socket_descriptor, struct sockaddr *local_address, int address_length)
#define _XOPEN_SOURCE 520 #include <sys/socket.h> int bind(int socket_descriptor, const struct sockaddr *local_address, socklen_t address_length)
The bind() function is used to associate a local address with a 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 sockaddr { u_short sa_family; char sa_data[14]; };
The BSD 4.4/UNIX 98 compatible structure is:
typedef uchar sa_family_t; struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; };
The BSD 4.4 sa_len field is the length of the address. The sa_family field identifies the address family to which the address belongs, and sa_data is the address whose format is dependent on the address family.
bind() returns an integer. Possible values are:
When a bind() fails, errno can be set to one of the following:
[EACCES] | Permission denied.
The process does not have the appropriate privileges to bind local_address to the socket pointed to by socket_descriptor (for example, if socket_descriptor is a socket with an address family of AF_INET, and the sockaddr_in structure (pointed to by local_address) specified a port that was restricted for use). |
[EADDRINUSE] | Address already in use.
This error code indicates one of the following:
|
[EADDRNOTAVAIL] | Address not available. This error code indicates
one of the following:
|
[EAFNOSUPPORT] | The type of socket is not supported in this
protocol family.
The address family specified in the address structure pointed to by local_address parameter cannot be used with the socket pointed to by the socket_descriptor parameter. |
[EBADF] | Descriptor not valid. |
[EDESTADDRREQ] | The local_address parameter is a null pointer. This error code is only returned on sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[EFAULT] | Bad address.
The system detected an address which was not valid while attempting to access the local_address parameter. |
[EINVAL] | Parameter not valid. This error code indicates
one of the following:
|
[EIO] | Input/output error. |
[ELOOP] | A loop exists in symbolic links encountered
during pathname resolution.
This error code is only returned on sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENAMETOOLONG] | File name too long.
This error code is only returned on sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENOBUFS] | There is not enough buffer space for the
requested operation. |
[ENOENT] | No such file or directory.
This error code is only returned on sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENOSYS] | Function not implemented.
This error code is only returned on sockets that use the AF_UNIX or AF_UNIX_CCSID or AF_UNIX_CCSID address family. |
[ENOTDIR] | Not a directory.
This error code is only returned on sockets that use the AF_UNIX or AF_UNIX_CCSID address family. |
[ENOTSOCK] | The specified descriptor does not reference a
socket. |
[EUNKNOWN] | Unknown system state. |
[EUNATCH] | The protocol required to support the specified address family is not available at this time. |
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. |
Also, processes trying to establish a connection with the connect() must have write access to the entry that is created.
The BSD 4.3 structure is:
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };
The BSD 4.4/UNIX 98 compatible structure is:
typedef uchar sa_family_t; struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };
The BSD 4.4 sin_len field is the length of the address. The sin_family is the address family (always AF_INET for TCP and UDP), sin_port is the port number, and sin_addr is the internet address. The sin_zero field is reserved and must be hex zeros.
The BSD 4.3 structure is:
typedef unsigned short sa_family_t; typedef unsigned short in_port_t; struct sockaddr_in6 { sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; };
The BSD 4.4/UNIX 98 compatible structure is:
typedef uchar sa_family_t; typedef unsigned short in_port_t; struct sockaddr_in6 { uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; };
The BSD 4.4 sin6_len field is the length of the address. The sin6_family is the address family (AF_INET6 in this case), sin6_port is the port number, and sin6_addr is the internet address. The sin6_flowinfo field contains two pieces of information: the traffic class and the flow label. Note: This field is currently not supported and should be set to zero for upward compatibility. The sin6_scope_id field identifies a set of interfaces as appropriate for the scope of the address carried in the sin6_addr field. Note: This field is currently not supported and should be set to zero for upward compatibility.
Top | UNIX-Type APIs | APIs by category |