#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <signal.h>
#define MULTICAST_GROUP "239.192.0.40"
#define SERVER_PORT 9930
#define SOURCE_IP "192.168.20.2"
#define SOURCE_PORT 8001
volatile int stop = 0;
void handle_signal(int signal) {
if (signal == SIGINT) {
stop = 1;
}
}
void send_messages(int sock) {
struct sockaddr_in multicast_addr;
struct sockaddr_in source_addr;
struct ip_mreq mreq;
struct timeval tv;
// Configurar la dirección de multicast
memset(&multicast_addr, 0, sizeof(multicast_addr));
multicast_addr.sin_family = AF_INET;
multicast_addr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);
multicast_addr.sin_port = htons(SERVER_PORT);
// Configurar la dirección de origen para multicast
memset(&source_addr, 0, sizeof(source_addr));
source_addr.sin_family = AF_INET;
source_addr.sin_addr.s_addr = inet_addr(SOURCE_IP);
source_addr.sin_port = htons(SOURCE_PORT);
// Enlazar a la dirección y puerto local
if (bind(sock, (struct sockaddr*)&source_addr, sizeof(source_addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// Configurar la interfaz y el puerto de origen para multicast
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &source_addr, sizeof(source_addr));
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
// Establecer el tiempo de vida de los paquetes
tv.tv_sec = 1;
tv.tv_usec = 0;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&tv, sizeof(struct timeval));
// Enviar mensajes de forma indefinida hasta que se reciba la señal SIGINT (Ctrl+C)
while (!stop) {
char message[50];
static int counter = 0;
sprintf(message, "Mensaje %d", ++counter);
sendto(sock, message, strlen(message), 0, (struct sockaddr*)&multicast_addr, sizeof(multicast_addr));
sleep(1);
}
// Cerrar el socket de envío
close(sock);
}
int main() {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("socket");
return EXIT_FAILURE;
}
// Configurar el manejador de señales
signal(SIGINT, handle_signal);
printf("El programa está enviando mensajes. Para terminar de forma segura, presiona Ctrl+C.\n");
send_messages(sock);
return 0;
}