2010-06-18 20 views
7

IPV6 kullanarak IPV4 yayın eşdeğerini nasıl yapacağını anlamaya çalışıyorum.IPV6 bağlantı yerel çok noktaya yayın

Engellemeyen bir IPV6 UDP soketi oluşturuyorum.

yan yayın itibaren

i anlamıyla sadece dinlemek tarafında port 12346.

üzerinde sendto "FF02 :: 1" yapıyorum ben şu bu yüzden gruba katılmanız gerekiyor keşfetti:

ipv6_mreq membership; 
    memset(&membership.ipv6mr_multiaddr, 0, sizeof(in6_addr)); 
    membership.ipv6mr_multiaddr.u.Word[0] = htons(0xff02); 
    membership.ipv6mr_multiaddr.u.Word[7] = htons(0x0001); 
    membership.ipv6mr_interface    = 0; 

    if(enable) 
    { 
     if (0 != setsockopt(m_Socket, SOL_SOCKET, IPV6_JOIN_GROUP, (char*)&membership, sizeof(ipv6_mreq))) 
     { 
      DisplayError(); 
      return false; 
     } 
    } 

Ancak setsockopt daima "WSAENOPROTOOPT" değerini döndürür. Niye ya? Bu konuda bana yardım eden var mı? Tam bir kaybettim.

Düzenleme: "IPPROTO_IPV6" düzeyini değiştirdim ancak şimdi bir "WSAEINVAL" alıyorum.

+0

@bdonlan: Şerefe. Gonan kendim yaptım ama unuttum :) – Goz

cevap

4

arayüz adresleri arayüzüne sadece özel olduklarından yerel IPv6 kapsamlı için ayarlanmalıdır. basit anlamda adres fe80 :: 1 eth0 eth1 hem aittir ama tamamen ayrıdır olabilir.

Yani bu araçlar t gerekir o çok noktaya yayınları destekleyen veya kullanıcıya belirli bir arabirimi belirleme aracı sağlayan her yukarı arabirimine bir çok noktaya yayın paketi gönderin.

sizin burada çok noktaya kodunu kontrol edebilirsiniz yardımcı olursa (düzenleme),

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/

+0

Yani IPV6_JOIN_GROUP yapmadan önce fe80 :: 1/rasgele bağlantı noktasına bağlanmam gerektiğini söylüyorsunuz? – Goz

+0

GetAdapterAddresses() öğesinin çıkışında ve IPv6 adres çağrısı IPV6_JOIN_GROUP ile her bir benzersiz arabirim dizini için çalıştırın. –

+0

Aslında ben grup katılmadan ÖNCE bağladılar ve birleştirme iyi geçti ... Thats mükemmel :) – Goz

1

Sorun şu ki, ipv6mr_interface değerini sıfır olarak bırakıyorsunuz, bu da ff02 :: 1 gibi bir bağlantı kapsamı çok noktaya yayın adresini kullanmak istiyorsanız yeterince iyi değil. Ipv6mr_interface değerini, paketlerin gönderilmesini/alınmasını istediğiniz yerel ağ arabirimine karşılık gelen numaraya ayarlamanız gerekir. (Geçerli bilgisayarda hangi arayüz indekslerinin getaddrinfo() ile çağrılacağını ve sin6_addr.s6_addr değerlerini (struct sockaddr_in6 *) 'ın elinize verdiklerini öğrenebilirsiniz)

Kendiniz için düşündüren nokta, eğer arayüz sıfır "tüm arayüzler" ayarı olarak hareket ederse çok daha kolay olmazdı ... evet, öyle olurdu. Ne yazık ki, IPv6 bunu bir nedenden dolayı yapmaz :()

+0

Ne yazık ki windows altında ana adaptör için bölge indeksi 5 olduğunu gördüm. Bu yüzden bu endeksi denedim. Ayrıca 1 ve hala şansım yoktu ... Arayüz indeksi bölge indeksi ile aynı mı? – Goz

+0

ayrıca bkz: http://msdn.microsoft.com/en-us/library/ms738655(VS.85).aspx – Goz

+0

Bölge indeksi ve arayüz indeksinin aynı şey olduğundan% 99 eminim; Bu yüzden başka bir şey de sorun olabilir. Windows altında, her bağdaştırıcının PIP_ADAPTER_ADDRESSES yapısının Ipv6IfIndex alanına ulaşmak için GetAdaptersAddresses() öğesini çağırabilirsiniz. GetAdaptersAddresses(), Posix'in getaddrinfo() işlevinden daha da eğlencelidir ... bu işlevin kullanımını görmek için aşağıdaki dosyadaki satırları 1034-1124 (özellikle satır 1097) olarak işaretleyin: www.lcscanada.com/muscle/ kas/util/NetworkUtilityFunctions.cpp –

İlgili konular