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

标签 sockets c++11

我正在尝试使用 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/

相关文章:

c++ - Xcode 4.6/Clang 4.2 找不到 C++11 header

c++ - std::function/bind 就像没有标准 C++ 库的类型删除

sockets - 有人可以改善我的代码吗?怎么了?

python - 从套接字导入模块错误python

c - 在 VirtualBox 内的 Debian 上调用 socket() 时出现错误 97

c - 通过 UDP 套接字后展开结构

python - python3-cd在反向shell中不起作用

c++ - 模板处理程序方法调度程序

仅在没有优化的情况下编译时出现 C++ 错误 (GCC)

C++ 不允许转换为右值引用