c - 套接字:如何使用 inet_pton() 屏蔽二进制形式的 ip 地址

标签 c sockets binary ip bitmask

我正在寻找使用套接字对 ip 地址执行掩码操作的正确方法。我尝试使用 inet_pton 将 ip 地址转换为二进制,然后执行二进制和 (&),但编译器提示我无法将 sin_addr 转换为 unsigned int。有人可以指导我执行此操作的正确方法吗?

struct sockaddr_in sa;
struct sockaddr_in maska;
char str[INET_ADDRSTRLEN];
// store IP address and mask in sockaddr structs:
inet_pton(AF_INET, "192.0.2.33", &(sa.sin_addr));
inet_pton(AF_INET, "255.255.255.0", &(maska.sin_addr));

// Try to perform mask
sa.sin_addr = (unsigned long)sa.sin_addr & (unsigned long)maska.sin_addr;

// now get it back and print it
inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN);

printf("%s\n", str);

最佳答案

错误的产生是因为当它是一个 struct in_addr 时,你分配 sa.sin_addr 就好像它是一个 unsigned long

struct sockaddr_in {
    short            sin_family;
    unsigned short   sin_port;
    struct in_addr   sin_addr;
    char             sin_zero[8];
};

您应该使用包含地址的成员。

struct in_addr {
    unsigned long s_addr;
};

改变这一行:

sa.sin_addr = (unsigned long)sa.sin_addr & (unsigned long)maska.sin_addr;

为此:

sa.sin_addr.s_addr = sa.sin_addr.s_addr & maska.sin_addr.s_addr;

关于c - 套接字:如何使用 inet_pton() 屏蔽二进制形式的 ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36434514/

相关文章:

c - 正确使用 malloc

c - 在 Linux 中的不同线程之间缓冲 `printf` 输出

在本地文件夹上创建目录

opencv - 未能形成二分类并使用 predict_prob() : Random Forest, opencv

c# - 如何在 C# 中获取 float 的 IEEE 754 二进制表示

security - 自验证二进制文件?

c - 将 calloc 与数组一起使用并返回指针时出现问题

java - 在 Android 操作系统中使用 SSLSocket 的 TLS 连接速度很慢

angularjs - 连接到 Node REST api 的应用程序被客户防火墙阻止

c - 从套接字中读取一行