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 )。