Getnameinfo points to socklen_t

The second argument to the prototype getnameinfo requests the type socklen_t, 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 a compiler error:

socklen_t VAR;
getnameinfo((struct sockaddr *)&SIN, &VAR, BUFFER, NI_MAXHOST, NULL, 0, 0);
+3
source share
3 answers

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

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

, size_t socklen_t, , , .

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

, --socken_t socklen_t.

+8

( IMHO , socklen_t.)

, size_t POSIX Sockets API, . bind(), listen(), connect(), struct sockaddr, .

POSIX , :

socklen_t , , . socklen_t - , ; , , : , , , , . size_t read(), write() ..

socklen_t ( BSD UNIX) int. POSIX.1-2008 size_t, , . - 64- , , size_t ( ) ILP32 LP64. int , , 64- . , : socklen_t.

0

Source: https://habr.com/ru/post/1743973/


All Articles