我正在尝试用libmilter开发一个邮件过滤器,为此我必须定义一些回调函数,目前我正在纠结于connect()函数,声明如下:
sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, struct sockaddr *hostaddr);
当一个客户端连接到milter时,这个回调函数被调用。现在我想记录主机名,IP和端口。对于主机名来说这很容易。但是我不能让它和hostaddr一起工作。
我在StackOverflow上找到了一些类似的文章,但是没有一篇适合我。看起来我必须将结构转换为sockaddr_in或sockaddr_in6,但是我遇到了编译器问题,比如"成员访问不完整的类型'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";
}
我从来没有想过,得到这么琐碎的信息会这么难:-)
4条答案
按热度按时间t9aqgxwy1#
从二进制转换为字符串需要
inet_ntop
,而不是inet_pton
。示例:
p1tboqfb2#
IPv4的非编译测试示例。IPv6几乎相同,只是调整了所使用的常量定义(请阅读inet_ntop手册页)
k4emjkb13#
我发现了一个不同的答案。在这里发帖后,我再次谷歌搜索,发现了这个,它终于对我起作用了:
ilmyapht4#