2016-04-05 10 views
0

ソケットを使用してIPアドレスでマスク操作を実行する正しい方法を探しています。私はinet_ptonを使用してIPアドレスをバイナリに変換しようとしましたが、バイナリと(&)を実行しましたが、コンパイラはsin_addrをunsigned intにキャストできないと訴えています。誰かがこれを行うための正しい方法に私を導くことができますか?ソケット:inet_pton()を使用してバイナリ形式のIPアドレスをマスクする方法

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

それはstruct in_addrあるとき、それはunsigned longであるかのようにあなたがsa.sin_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

うん、それはそれをした。 –

関連する問題