gpt4 book ai didi

sockets - C++ - 如何从 struct sockaddr 获取 IP 和端口

转载 作者:行者123 更新时间:2023-12-03 11:50:03 28 4
gpt4 key购买 nike

我正在尝试使用 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";
}

我从没想过要获得如此琐碎的信息会如此困难:-)

最佳答案

IPv4 的非编译测试示例。 IPv6 几乎相同,只需调整使用的常量定义(阅读 inet_ntop 手册页)

#include <arpa/inet.h>

void print_ipv4(struct sockaddr *s)
{
struct sockaddr_in *sin = (struct sockaddr_in *)s;
char ip[INET_ADDRSTRLEN];
uint16_t port;

inet_pton (AF_INET, sin->sin_addr, ip, sizeof (ip));
port = htons (sin->sin_port);

printf ("host %s:%d\n", ip, port);
}

关于sockets - C++ - 如何从 struct sockaddr 获取 IP 和端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37721310/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com