c - getnameinfo 指定 socklen_t

标签 c linux networking posix socklen-t

getnameinfo 原型(prototype)的第二个参数要求 socklen_t 类型,但 sizeof 使用 size_t。那么我怎样才能得到 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);

例子:

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

给出编译器错误,因为您传递的是指向 a-socken_t 的指针而不是 socklen_t。

关于c - getnameinfo 指定 socklen_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2765117/

相关文章:

c - void function(stuct *s) 与 void function(stuct s) 有什么区别?

linux - 关闭所有正在运行的虚拟机并再次启动自动启动机器

security - 如何将网卡置于混杂模式?

networking - Kubernetes:没有托管路由

python - Twisted 在连接关闭之前不发送任何内容

c - 有没有办法禁用磁盘文件的系统(unix)缓存?

c - 使用指向指针数组成员的指针进行静态结构初始化

c - 为什么我得到 "Iresult"值右移?

linux - Debian 上的 pgadmin 黑色背景字体

c++ - 在Linux中编译Windows Qt代码并更改库