getnameinfo指定socklen_t
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);
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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
size_t
定义为无符号整数类型; C99保证至少是16位。socklen_t
定义为积分至少 32 位的类型。 (编辑:它不一定是无符号的,尽管实际上负长度是没有意义的。)因此,传递
size_t
参数并让编译器隐式将其转换为socklen_t
,我认为它使您的代码更清晰,让隐式转换发生而不是添加迂腐的强制转换。您的最后
一个示例给出了编译器错误,因为您传递的是指向 a-socken_t 而不是 socklen_t 的指针。
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.
(这实际上是 这个恕我直言,错误地重复标记了问题,试图深入了解
socklen_t
的存在。)正如其他人指出的那样,它可以被认为是
size_t< /code> 相当于 POSIX Sockets API,表示各种数据结构的长度(以字节为单位)。它在
bind()
、listen()
、connect()
函数中最为显着,其中它表示的各种实现的长度。 code>struct sockaddr
但它根本不限于此。POSIX 规范实际上解释了它的过去和现在的样子恕我直言,非常有启发性:
(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:
您的信息已过时, socklen_t 是至少 32 位的整数类型(不一定是无符号)(http://www.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html)。
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).