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

C 套接字:如何使用inet_pton()屏蔽ip地址的二进制形式,c,sockets,binary,ip,bitmask,C,Sockets,Binary,Ip,Bitmask,我正在寻找使用套接字对ip地址执行掩码操作的正确方法。我试图使用inet_pton将ip地址转换为二进制,然后执行二进制and(&),但编译器抱怨我无法将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(

我正在寻找使用套接字对ip地址执行掩码操作的正确方法。我试图使用inet_pton将ip地址转换为二进制,然后执行二进制and(&),但编译器抱怨我无法将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);

导致此错误的原因是,当sa.sin\u addr是一个
结构时,将其赋值为
无符号长

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;

一个
sin\u addr
不仅仅是一个数字。非常确定您正在寻找类似于
sa.sin\u addr.s\u addr=sa.sin\u addr.s\u addr&maska.sin\u addr.s\u addr,但我相信还有比这更好的方法。”WhozCraig,谢谢。是的,我正在寻找一个执行屏蔽操作并返回屏蔽地址的套接字函数,但我没有找到任何与该功能相关的东西。不过你的方法很有效。