2016-04-05 20 views
0

Bir ip adresinde maske işlemi gerçekleştirmek için yuvaları kullanmanın doğru yolunu arıyorum. Ip adreslerini inet_pton kullanarak ikiliye dönüştürmeyi denedim ve sonra bir ikili ve (&), ancak derleyici imzasız int için sin_addr atayamam şikayet ediyor. Birisi bunu yapmak için bana doğru yöntemi yönlendirebilir mi? Bir struct in_addr olduğunda bir unsigned long sanki sen sa.sin_addr atama çünküYuvalar: inet_pton() kullanarak ip adresinin ikili formunu maskeleme()

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

sadece bir sayıdan öte bir 'sin_addr' için çok daha fazlası var. Sa.sin_addr.s_addr = sa.sin_addr.s_addr & maska.sin_addr.s_addr; gibi bir şey aradığınıza emin olun, ancak eminim ki bunu yapmak için daha iyi bir yol var. – WhozCraig

+0

@ WhozCraig Teşekkürler. Evet, maskeleme işlemi yapan ve maskelenen adresi döndüren bir soket işlevi arıyordum, ancak bu işlevsellik ile hiçbir şey bulamadım. Sizin yönteminiz olsa çalışıyor. –

cevap

1

hata sonuçlanmaktadır.

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

Adresi içeren üyeyi kullanmalısınız.

struct in_addr { 
    unsigned long s_addr; 
}; 

Değişim bu satırı: Buna

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

Evet, bunu yaptı. –

İlgili konular