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 IBM® i 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. |
| [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.