Sockety multicastowe IPv6

0

Popełniłam takie kody:

//klient
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define MAXBUFSIZE 512

int main(int argc, char **argv)
{
    struct addrinfo hint, *info, *multi;
	
    char buffer[MAXBUFSIZE] = "";
    int err, sock, status;

    memset( &hint, 0, sizeof( hint ) );

    hint.ai_family = AF_INET6;
    hint.ai_socktype = SOCK_DGRAM;
    hint.ai_protocol = 0;

    // Set the multicast address
    getaddrinfo( "fff2::1", NULL, &hint, &info );

    struct sockaddr_in6 * addr = (struct sockaddr_in6*)info->ai_addr;
    addr->sin6_port = htons( 7890 );

    // create a socket
    sock = socket( AF_INET6, SOCK_DGRAM, 0 );
    bind(sock, (struct sockaddr*) addr, info->ai_addrlen);

    while (strcmp(buffer, "KONIEC\n"))
    {
        // czyscimy bufor
        memset(buffer, 0, MAXBUFSIZE);

        // wczytujemy wiadomosc
        fgets(buffer, MAXBUFSIZE, stdin);

        sendto(sock, buffer, strlen(buffer), 0, info->ai_addr, info->ai_addrlen);
    }

    close(sock);
    return 0;
}
//serwer
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define MAXBUFSIZE 512 // Max UDP Packet size is 64 Kbyte

int main(int argc, char **argv)
{
    struct addrinfo hint, *multi, *info;
    struct ipv6_mreq mreq6;
    struct sockaddr_in6 * addr;

    char buffer[MAXBUFSIZE] = "";
    int status, sock, err;

    memset(&hint, 0, sizeof( hint ));

    hint.ai_family = AF_INET6;
    hint.ai_socktype = SOCK_DGRAM;

    //Find the interface to use
    getaddrinfo("fe80::219:d1ff:fe69:a778", NULL, &hint, &info);

    addr = (struct sockaddr_in6*)info->ai_addr;
    addr->sin6_addr = in6addr_any;
    addr->sin6_port = htons( 7890 );

    // create a socket
    sock = socket( AF_INET6, SOCK_DGRAM, 0 );

    bind(sock, (struct sockaddr*) addr, info->ai_addrlen);

    // Set the multicast address    
    getaddrinfo( "fff2::1", NULL, &hint, &multi );

    struct ipv6_mreq mreq;
    memset( &mreq, 0, sizeof(mreq) );
    memcpy( &mreq.ipv6mr_multiaddr, &((struct sockaddr_in6 *) multi->ai_addr)->sin6_addr, sizeof(mreq.ipv6mr_multiaddr) );
    freeaddrinfo( multi );

    // JOIN multicast group on default interface
    setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq));

    while (strcmp(buffer, "KONIEC\n"))
    {
        memset(buffer, 0, MAXBUFSIZE);
	
        // receive packet from socket
        recvfrom(sock, buffer, MAXBUFSIZE, 0, NULL, NULL);
        printf("%s", buffer);
    }

return 0;
}

No i teraz prośba do was, drodzy forumowicze - weźcie mi skrytykujcie ten kod.
Obsługa błędów akurat mało mnie interesuje, bo jak nie będzie działać, to nie będzie działać i tyle, a jest to program poglądowy do przedstawienia na laboratorium.

Dlaczego proszę o rzucenie okiem - komunikacja działa. Jak utworzę dwie grupy multicastowe, to ich komunikacja nie miesza się ze sobą, wszystko wygląda cacy i ok. Ale gdy włączyłam wiresharka, strasznie się zdziwiłam, bo okazało się, że wszystkie pakiety są adresowane na ff02::1 oO Nie kumam o co kaman, bo przecież są odbierane prawidłowo. Nie wiem czy to jakiś tajemny mechanizm IPv6, zamieniać pakietom adres docelowy, czy co... Podejrzewam, że mam jakiś głupi błąd (albo i błędy) w kodzie, które powodują, że zamiast wysyłać na dany adres, wysyła na lokalne hosty.
Co i tak jest bez sensu, bo przecież odbierane są prawidłowo.... nie kumam.....

0

Właśnie przeczytałem kod i problem. Polecam lekturę IP Version 6 Addressing Architecture RFC4291 p. 2.7. W adresach multicastowych FF00::/8 kolejne 8 bitów po FF ma ściśle zdefiniowane znaczenie i używany przez ciebie adres nie jest poprawny stąd zapewne takie a nie inne zachowanie stosu IPv6 w systemie obserwowane w Wiresharku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1