我正在尝试使用libmilter开发邮件过滤器。因此,我需要定义一些回调函数。目前,我遇到了connect()函数的问题。其声明如下:
sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, struct sockaddr *hostaddr);
当客户端连接到milter时,将调用此回调函数。现在我想记录主机名、IP和端口。对于主机名来说很容易。但是我无法通过hostaddr使其正常工作。
我在StackOverflow上找到了一些类似的文章,但没有一个适用于我。看起来我必须将结构体转换为sockaddr_in或sockaddr_in6,但我遇到了编译器问题,如“member access into incomplete type 'struct sockaddr_in'”。
这是我尝试过的内容:
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
string ipandport;
switch (hostaddr->sa_family) {
case AF_INET:
sin = (struct sockaddr_in *) hostaddr;
unsigned char *ip = (unsigned char *)&sin->sin_addr.s_addr;
break;
case AF_INET6:
// TODO
break;
default:
ipandport = "unknown";
}
我从未想过获取这样琐碎的信息会如此困难 :-)
这句话与IT技术无关。
ntohs
而不是htons
吗? - sorush-rinet_pton
原型(如 man-pages 5.02,2019-03-06 中所列)不包括您在那里使用的sizeof
的第四个参数。 - i336_inet_pton
将字符串转换为struct sockaddr_in
,需要使用inet_ntop
将struct sockaddr_in
转换为字符串。(请参见我的答案。) - fadedbee