2013-01-23 20 views
12

Bir soketi belirli bir ağ arabirimine nasıl bağlarım? Sunucu tarafında setsockopt kullanmayı denedim, ancak istemciler yine de eth0 ve lo arabirimleri aracılığıyla hizmete erişebilir.Ağ arabirimine soket soketi

Bunu, özel IP adresini serv_addr.sin_addr.s_addr kullanarak ayarlayarak başarabilirim.

Ancak, yalnızca setsockopt'u kullanarak (IP adresinden bahsetmeden) bir arabirime bağlanabileceğimizden şüpheleniyorum.

bağlanma adresini bilmeden serv_addr.sin_addr.s_addr

Sen bunu yapamaz kullanarak belirli bir IP adresini belirleyerek - bunu yapabilirsiniz

cevap

2

tek yolu söz gibidir.

Gerekirse şimdiki IP adresini belirlemek için ioctl s kullanabilirsiniz, ancak bu günlerde daha akıllıca bir yol olabilir - Son zamanlarda modern Linux dağıtımlarında fazla bir şey yapmadım.

+0

Thnks joe. SO_BINDTODEVICE ile setsockopt kullanımını bilir miyim? – user2003595

14

SO_BINDTODEVICE soket seçeneğini ayarlayarak belirli bir arabirime bağlayabilirsiniz. Sen kök olmak zorunda ve bu seçeneği kullanmak için CAP_NET_RAW yeteneğine sahip: Uyarı

struct ifreq ifr; 

memset(&ifr, 0, sizeof(ifr)); 
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0"); 
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) { 
    ... error handling ... 
} 

.

İkinci yöntem, getifaddrs() ile bir arabirime bağlanan IP adresini çözebilmenizdir.

Kapsamlı bir örnek için ikinci bağlantıyı izleyin.

+0

Bir ioctl'den daha iyi bir yol olması gerektiğini biliyordum! :-) – Joe

+0

Haklısınız .... güncellenmiş;) –

+0

Yeni bir sorum var, bu yüzden eth0 ve eth1'in yönteminizi kullanarak aynı IP adresine sahip olması önemli mi? – Splash