There are two versions of most sockets APIs. The base IBM® i API uses BSD 4.3 structures and syntax. The other uses syntax and structures compatible with BSD 4.4 and the UNIX® 98 programming interface specifications. You can select the UNIX 98 compatible interface by defining the _XOPEN_SOURCE macro to a value of 520 or greater.
When you develop in C-based languages and an application is compiled with the _XOPEN_SOURCE macro defined to the value 520 or greater, some sockets APIs are mapped to internal names, as shown in the following table:
| Mapped name | Internal name |
|---|---|
| accept() | qso_accept98() |
| accept_and_recv() | qso_accept_and_recv98() |
| bind() | qso_bind98() |
| bind2addrsel() | qso_bind2addrsel98() |
| connect() | qso_connect98() |
| endhostent() | qso_endhostent98() |
| endnetent() | qso_endnetent98() |
| endprotoent() | qso_endprotoent98() |
| endservent() | qso_endservent98() |
| getaddrinfo() | qso_getaddrinfo98() |
| gethostbyaddr() | qso_gethostbyaddr98() |
| gethostbyaddr_r() | qso_gethostbyaddr_r98() |
| gethostname() | qso_gethostname98() |
| gethostname_r() | qso_gethostname_r98() |
| gethostbyname() | qso_gethostbyname98() |
| gethostent() | qso_gethostent98() |
| getnameinfo() | qso_getnameinfo98() |
| getnetbyaddr() | qso_getnetbyaddr98() |
| getnetbyname() | qso_getnetbyname98() |
| getnetent() | qso_getnetent98() |
| getpeername() | qso_getpeername98() |
| getprotobyname() | qso_getprotobyname98() |
| getprotobynumber() | qso_getprotobynumber98() |
| getprotoent() | qso_getprotoent98() |
| getsockname() | qso_getsockname98() |
| getsockopt() | qso_getsockopt98() |
| getservbyname() | qso_getservbyname98() |
| getservbyport() | qso_getservbyport98() |
| getservent() | qso_getservent98() |
| getsourcefilter() | qso_getsourcefilter98() |
| inet_addr() | qso_inet_addr98() |
| inet6_is_srcaddr() | qso_inet_is_srcaddr98() |
| inet_lnaof() | qso_inet_lnaof98() |
| inet_makeaddr() | qso_inet_makeaddr98() |
| inet_netof() | qso_inet_netof98() |
| inet_network() | qso_inet_network98() |
| listen() | qso_listen98() |
| Rbind() | qso_Rbind98() |
| recv() | qso_recv98() |
| recvfrom98() | qso_recvfrom98() |
| recvmsg() | qso_recvmsg98() |
| send() | qso_send98() |
| sendmsg() | qso_sendmsg98() |
| sendto() | qso_sendto98() |
| sethostent() | qso_sethostent98() |
| setnetent() | qso_setnetent98() |
| setprotoent() | qso_setprotoent98() |
| setservent() | qso_setprotoent98() |
| setsockopt() | qso_setsockopt98() |
| setsourcefilter() | qso_setsourcefilter98() |
| shutdown() | qso_shutdown98() |
| socket() | qso_socket98() |
| socketpair() | qso_socketpair98() |
Application not using C-based languages can use the internal names if necessary.
Using _XOPEN_SOURCE also changes some of the structures used by sockets to match BSD 4.4/UNIX 98 standards. The differences are summarized in the following table:
| BSD 4.3 structure | BSD 4.4/UNIX 98 compatible structure |
|---|---|
typedef int socklen_t;
typedef unsigned short sa_family_t;
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
struct sockaddr_un {
short sun_family;
char sun_path[126];
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
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;
};
|
typedef int socklen_t;
typedef uchar sa_family_t;
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
struct sockaddr_un {
uint8_t sun_len;
sa_family_t sun_family;
char sun_path[126];
};
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];
};
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;
};
|
struct msghdr {
caddr_t msg_name;
int msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
caddr_t msg_accrights;
int msg_accrightslen;
};
|
struct msghdr {
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
void *msg_control;
socklen_t msg_controllen;
int msg_flags;
};
|
(no equivalent) |
struct cmsghdr {
socklen_t cmsg_len;
int cmsg_level;
int cmsg_type;
};
|
#define _SS_MAXSIZE 304
#define _SS_ALIGNSIZE (sizeof (char*))
#define _SS_PAD1SIZE (_SS_ALIGNSIZE -
sizeof(sa_family_t))
#define _SS_PAD2SIZE (_SS_MAXSIZE -
(sizeof(sa_family_t) +
_SS_PAD1SIZE +
_SS_ALIGNSIZE))
struct sockaddr_storage {
sa_family_t ss_family;
char _ss_pad1[_SS_PAD1SIZE];
char* _ss_align;
char _ss_pad2[_SS_PAD2SIZE];
};
|
#define _SS_MAXSIZE 304
#define _SS_ALIGNSIZE (sizeof (char*))
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - (sizeof(uint8_t) +
sizeof(sa_family_t)))
#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(uint8_t) +
sizeof(sa_family_t) +
_SS_PAD1SIZE + _SS_ALIGNSIZE))
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
char _ss_pad1[_SS_PAD1SIZE];
char* _ss_align;
char _ss_pad2[_SS_PAD2SIZE];
};
|
(no equivalent) |
typedef int in_addr_t; typedef unsigned short in_port_t; |