getnameinfo原型的第二个参数要求使用socklen_t类型,但sizeof使用size_t。那么如何获取socklen_t?
原型:
int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen,
char *restrict node, socklen_t nodelen, char *restrict service,
socklen_t servicelen, int flags);
例子:
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);
这将导致编译器错误:
socklen_t VAR;
getnameinfo((struct sockaddr *)&SIN, &VAR, BUFFER, NI_MAXHOST, NULL, 0, 0);
最佳答案
size_t
is defined作为无符号整数类型;C99保证它至少是16位。socklen_t
is defined作为至少32位的整数类型(编辑:它不一定是无符号的,尽管实际上负长度是没有意义的。)
因此,传递size_t
参数并让编译器隐式将其转换为socklen_t
是没有问题的,而且我认为让隐式转换发生而不是添加迂腐的转换会使代码更清晰。
你的最后一个例子
socklen_t VAR;
getnameinfo((struct sockaddr *)&SIN, &VAR, BUFFER, NI_MAXHOST, NULL, 0, 0);
给出一个编译器错误,因为您传递的是指向socken的指针,而不是socklen。
关于c - getnameinfo指定socklen_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31222562/