main.c 2.83 KB
#include <stdio.h>
#include <string.h> // pour strlen()
#include <stdlib.h> // pour exit()
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <arpa/inet.h>

//Fonction permettant d'envoyer un message en broadcast
void sendUDPBroadcast(unsigned char *message, int taille_message, int port) {
    int broadcast_enable = 1;
    //Option broadcast ON
    int s = socket(AF_INET, SOCK_DGRAM, 0);
    //Création de la socket : s = file descriptor de la socket, AF_INET (socket internet), SOCK_DGRAM (datagramme, UDP, sans connexion)
    if(s < 0){
        //Test de la valeur de retour de la socket
        perror("sendUDPBroadcast.socket");
        exit(-1); 
    }
    if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)) < 0) {
        //Mise option broadcast à la socket
        perror("sendUDPBroadcast.setsockopt");
        exit(-1);
    }
    
    struct sockaddr_in broadcast_address;
    memset(&broadcast_address, 0, sizeof(broadcast_address));
    broadcast_address.sin_family = AF_INET;
    broadcast_address.sin_port = htons(port);
    broadcast_address.sin_addr.s_addr = INADDR_BROADCAST; //255.255.255.255
    
    //Envoie du message grâce à la socket
    if(sendto(s, message, taille_message, 0, (struct sockaddr *) &broadcast_address,
            sizeof(broadcast_address)) < 0 ) {
        perror("sendUDPBroadcast.sendto");
        exit(-1);
    }
}

//Fonction permettant d'envoyer un message à une adresse
void sendUDPUnicast(char *address, unsigned char *message, int taille_message, int port) {
    int s = socket(AF_INET, SOCK_DGRAM, 0);
    //Création de la socket : s = file descriptor de la socket, AF_INET (socket internet), SOCK_DGRAM (datagramme, UDP, sans connexion)
    if(s < 0){
        //Test de la valeur de retour de la socket
        perror("sendUDPUnicast.socket");
        exit(-1); 
    }
    struct sockaddr_in unicast_address;
    //Creation structure adresse de destination
    memset(&unicast_address, 0, sizeof(unicast_address));
    //Mise à zéro de la structure d'adresse
    unicast_address.sin_family = AF_INET;
    unicast_address.sin_port = htons(port);
    //Mise du port en ordre du réseau (big endian)
    unicast_address.sin_addr.s_addr = inet_addr(address);
    if(sendto(s, message, taille_message, 0, (struct sockaddr *) &unicast_address, sizeof(unicast_address)) < 0 ) {
        perror("sendUDPUnicast.sendto");
        exit(-1);
    }
}

int main(void){
    unsigned char message_broadcast[100] = "J'envoie en UDP boradcast";
    unsigned char message_unicast[100] = "J'envoie en UDP unicast";

    // send broadcast
    sendUDPBroadcast(message_broadcast, strlen(message_broadcast), 2030);

    // send unicast
    char adresse[50] = "127.0.0.1";
    sendUDPUnicast(adresse, message_unicast, strlen(message_unicast), 2030);

    return 0;
}