JustPaste.it
#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;
}