Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getnameinfo specifies socklen_t

The 2nd arg for the getnameinfo prototype asks for a socklen_t type but sizeof uses size_t. So how can I get socklen_t ?

Prototype:

int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen,
       char *restrict node, socklen_t nodelen, char *restrict service,
       socklen_t servicelen, int flags);

Example:

struct sockaddr_in SIN;
memset(&SIN, 0, sizeof(SIN)); // This should also be socklen_t ?
SIN.sin_family      = AF_INET;
SIN.sin_addr.s_addr = inet_addr(IP);
SIN.sin_port        = 0;

getnameinfo((struct sockaddr *)&SIN, sizeof(SIN) /* socklen_t */, BUFFER, NI_MAXHOST, NULL, 0, 0);

This will give compiler error:

socklen_t VAR;
getnameinfo((struct sockaddr *)&SIN, &VAR, BUFFER, NI_MAXHOST, NULL, 0, 0);
like image 542
Neeladri Vishweswaran Avatar asked Dec 12 '22 22:12

Neeladri Vishweswaran


2 Answers

size_t is defined as an unsigned integral type; C99 guarantees that it is at least 16 bits.

socklen_t is defined as an integral type of at least 32 bits. (Edit: It's not necessarily unsigned, although in practice a negative length would be meaningless.)

So there's no problem with passing a size_t parameter and letting the compiler implicitly cast it to socklen_t, and I would argue that it makes your code clearer to let the implicit conversion occur instead of adding pedantic casts.

Your final example

socklen_t VAR;
getnameinfo((struct sockaddr *)&SIN, &VAR, BUFFER, NI_MAXHOST, NULL, 0, 0);

gives a compiler error because you're passing a pointer-to-a-socken_t instead of a socklen_t.

like image 140
Josh Kelley Avatar answered Dec 18 '22 00:12

Josh Kelley


Your information are out of date, socklen_t is an integer type (not necesarily unsigned) of at least 32 bits (http://www.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html).

like image 37
Nicolas Sitbon Avatar answered Dec 17 '22 23:12

Nicolas Sitbon