2016-04-05 32 views
0

掩碼的IP地址的二進制形式我正在尋找正確的方式來使用套接字執行掩碼操作的IP地址。我試圖使用inet_pton將ip地址轉換爲二進制文件,然後執行一個二進制文件和(&),但編譯器抱怨我無法將sin_addr轉換爲unsigned int。有人能指導我採取正確的方法嗎?套接字:如何使用inet_pton()

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); 
+1

有很多比只多不少的'sin_addr'。很確定你正在尋找'sa.sin_addr.s_addr = sa.sin_addr.s_addr&maska.sin_addr.s_addr;'之類的東西,但我相信有一個更好的方法來做到這一點。 – WhozCraig

+0

@ WhozCraig謝謝。是的,我正在尋找一個套接字函數,它執行掩碼操作並返回了掩碼地址,但是我沒有發現任何具有該功能的東西。你的方法雖然工作。 –

回答

1

該錯誤產生的,因爲要分配sa.sin_addr,就好像它是一個unsigned long當它是一個struct in_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; 
+0

是的,那是做到了。 –