Comtrol eCos User Manual

Page 515

Advertising
background image

Chapter 38. TCP/IP Library Reference

ai_socktype to SOCK_RAW, getaddrinfo() will raise an error, because

service names are not defined for the internet SOCK_RAW space.

o

If you specify a numeric servname, while leaving ai_socktype and

ai_protocol unspecified, getaddrinfo() will raise an error.

This is

because the numeric servname does not identify any socket type, and

getaddrinfo() is not allowed to glob the argument in such case.

All of the information returned by getaddrinfo() is dynamically allo-

cated: the addrinfo structures, the socket address structures, and canon-

ical node name strings pointed to by the addrinfo structures.

To return

this information to the system the function freeaddrinfo() is called.

The addrinfo structure pointed to by the ai argument is freed, along with

any dynamic storage pointed to by the structure.

This operation is

repeated until a NULL ai_next pointer is encountered.

To aid applications in printing error messages based on the EAI_xxx codes

returned by getaddrinfo(), gai_strerror() is defined.

The argument is

one of the EAI_xxx values defined earlier and the return value points to

a string describing the error.

If the argument is not one of the EAI_xxx

values, the function still returns a pointer to a string whose contents

indicate an unknown error.

Extension for scoped IPv6 address

The implementation allows experimental numeric IPv6 address notation with

scope identifier.

By appending the percent character and scope identi-

fier to addresses, you can fill sin6_scope_id field for addresses.

This

would make management of scoped address easier, and allows cut-and-paste

input of scoped address.

At this moment the code supports only link-local addresses with the for-

mat.

Scope identifier is hardcoded to name of hardware interface associ-

ated with the link.

(such as ne0).

Example would be like

“fe80::1%ne0”, which means “fe80::1 on the link associated with ne0

interface”.

The implementation is still very experimental and non-standard.

The cur-

rent implementation assumes one-by-one relationship between interface and

link, which is not necessarily true from the specification.

EXAMPLES

The following code tries to connect to “www.kame.net” service “http”.

via stream socket.

It loops through all the addresses available, regard-

less from address family.

If the destination resolves to IPv4 address,

it will use AF_INET socket.

Similarly, if it resolves to IPv6, AF_INET6

socket is used.

Observe that there is no hardcoded reference to particu-

lar address family.

The code works even if getaddrinfo returns addresses

that are not IPv4/v6.

struct addrinfo hints, *res, *res0;

int error;

int s;

const char *cause = NULL;

memset(&hints, 0, sizeof(hints));

411

Advertising