getnameinfo指定socklen_t

getnameinfo原型的第二个参数要求socklen_ttypes,但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 被定义为无符号整型; C99保证它至少有16位。

socklen_t 被定义为至少32位的整数类型。 ( 编辑:它不一定是无符号的,虽然在实践中负面的长度是没有意义的。)

所以,传递size_t参数并让编译器隐式地将其转换为socklen_t没有问题,而且我认为它会让你的代码更清晰,让隐式转换发生而不是添加迂腐转换。

你最后的例子

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

给出了一个编译器错误,因为你正在传递一个指向socken_t的指针而不是socklen_t。

您的信息已过时,socklen_t是至少32位的整数类型(不必是无符号的)( http://www.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html )。