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);
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).
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 tosocklen_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
gives a compiler error because you're passing a pointer-to-a-socken_t instead of a socklen_t.
(This is rather an answer to this IMHO falsely duplicate-tagged question that tries to get to the bottom of
socklen_t
's existence.)As others have pointed out it can be thought of as the
size_t
equivalent of the POSIX Sockets API that represents the length of various data structures in bytes. It is most notable in thebind()
,listen()
,connect()
functions where it denotes the length of the various implementations ofstruct sockaddr
but it is not limited to that at all.The POSIX specification actually explains how it became to be and is very instructive IMHO: