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.....