[TCP/IP] Définition de diffusion, principe et mise en œuvre de la programmation

        Cet article compte un total de 2974 mots et le temps de lecture estimé est de 4 minutes.

Table des matières

diffuser

Principes et formes de diffusion

Programmation et mise en œuvre de la diffusion

Paramètres des options de prise

expéditeur

destinataire

Développer les informations


diffuser

        La diffusion fait référence à une méthode de transmission dans laquelle, lorsque des paquets sont transmis sur un réseau informatique, l'adresse de destination correspond à tous les appareils du réseau. Les « tous les appareils » mentionnés ici sont également limités à une plage appelée « domaine de diffusion ».

        En fonction des caractéristiques de la diffusion, la diffusion est généralement utilisée en LAN mais pas en WAN.

Principes et formes de diffusion

        Le protocole de transmission de données de multidiffusion est le même que celui de multidiffusion, qui est réalisé via le protocole UDP. Parallèlement, la diffusion se divise sous deux formes, à savoir :

  • Diffusion directe (diffusion pouvant s'étendre sur différents réseaux)
  • Diffusion locale (diffusion uniquement au sein du réseau local)

        La diffusion directe est utilisée pour transmettre des données à un hôte dans une zone spécifique (l'adresse réseau de l'hôte cible est connue). En cours d'utilisation, si l'adresse IP et le masque de sous-réseau de l'hôte cible sont 192.168.1.0/24 , alors l'adresse de diffusion est 192.168.1.255 . (Il convient de noter que 255.255.255.255 est une adresse de diffusion restreinte et ne peut pas être utilisée.) Lors de l'envoi d'un paquet de données selon cette adresse, le routeur enverra le paquet de données à tous les hôtes sous 192.168.1.1 ~ 192.168.1.254 , comme montré dans la figure ci-dessous Afficher :

        La diffusion locale est utilisée pour la communication au sein du réseau local (ne peut être utilisée que sous LAN). Quel que soit le réseau IP sur lequel se trouve un hôte particulier, l'hôte actuel peut toujours utiliser l'adresse 255.255.255.255  pour envoyer des paquets à chaque nœud du réseau local. Par exemple, si un hôte du segment de réseau 192.168.0 envoie un paquet de données à 255.255.255.255 , alorstous les hôtes du segment de réseau 192.168.0 Comme indiqué ci-dessous:

développer:

        Comment savoir à quel domaine de diffusion appartient un hôte ?

        Vous pouvez savoir à quel domaine de diffusion appartient l'hôte en effectuant une opération ET sur l'adresse IP et le masque de sous-réseau de l'hôte.

        Par exemple : l'adresse IP d'un hôte est 192(1100 0000).168(1010 1000).23(0001 0111).150(1001 0110), et le masque de sous-réseau est 255(1111 1111).255.255.0, puis Le domaine de diffusion auquel il appartient est (le calcul réel est en binaire ~) :

192.168.23.150 \coin 255.255.255.0 = 192.168.23.0

        Ensuite, tous les autres hôtes du domaine de diffusion 192.168.23.0 peuvent recevoir les paquets de diffusion envoyés par l'appareil.

développer:

        Comment calculer l'adresse de diffusion ?

        L'adresse de diffusion est calculée en « inversant » le masque de sous-réseau, puis en effectuant une « opération OU » avec le domaine de diffusion.
        Par exemple : le domaine de diffusion auquel appartient actuellement l'hôte est 192(1100 0000).168(1010 1000).0.0 et le masque de sous-réseau est 255.255.0.0, alors l'adresse de diffusion est (est une opération OU, c'est-à- \veedire |; \simest une opération inverse) :

192.168.0.0 \vee (\sim255.255.0.0) = 192.168.255.255

Programmation et mise en œuvre de la diffusion

Paramètres des options de prise

        La mise en œuvre de la programmation de la diffusion est similaire à celle de la multidiffusion, la différence réside dans le paramétrage des options de socket. Grâce à la fonction setcokopt , définissez le niveau d'option sur  SOL_SOCKET  et l'option correspondante est  SO_BROADCAST  . L'option est mise à 1, ce qui signifie que « la diffusion des données est possible ».

int send_sock;
int so_brd = 1; //对变量进行初始化以将 SO_BROADCAST 选项信息设为 1 

send_sock = socket(PF_INET , SOCK_DGRAM , 0);

setsockopt(send_sock , SOL_SOCKET , SO_BROADCAST , (void*) & so_brd , sizeof(so_brd));

expéditeur

        L'implémentation est similaire à la multidiffusion, se concentrant principalement sur la configuration des options de socket.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

//报错消息发送
void Sender_message(char *message)
{
    puts(message);
    exit(1);
}


int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in brd_addr;
	FILE *fp;
	char buf[BUF_SIZE];
	int so_brd=1;
	
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);
    if(send_sock==-1)
    {
        Sender_message((char*)"socket creation error");
    }	
	memset(&brd_addr, 0, sizeof(brd_addr));
	brd_addr.sin_family=AF_INET;
	brd_addr.sin_addr.s_addr=inet_addr(argv[1]);
	brd_addr.sin_port=htons(atoi(argv[2]));
	
	setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));	
	fp=fopen(argv[3], "r");
    if(fp==NULL)
    {
		Sender_message((char*)"file open error");
    }

	while(!feof(fp))
	{
		fgets(buf, BUF_SIZE, fp);
		sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&brd_addr, sizeof(brd_addr));
	}

	close(send_sock);
	return 0;
}

destinataire

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

// 报错消息发送
void Sender_message(char *message)
{
    puts(message);
    exit(1);
}

int main(int argc, char *argv[])
{
    int recv_sock;
    struct sockaddr_in addr;
    int str_len;
    char buf[BUF_SIZE];

    recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (recv_sock == -1)
    {
        Sender_message((char *)"socket creation error");
    }
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(atoi(argv[1]));

    if (bind(recv_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1)
    {
        Sender_message((char *)"bind error");
    }
    while (1)
    {
        str_len = recvfrom(recv_sock, buf, BUF_SIZE - 1, 0, NULL, 0);
        if (str_len < 0)
        {
            break;
        }
        buf[str_len] = 0;
        fputs(buf, stdout);
    }

    close(recv_sock);
    return 0;
}

résultat de l'opération :

Développer les informations

[1]  Explication détaillée des fonctions et paramètres de la fonction setsockopt - Blog Park 

[2]  Quelle est la différence entre une diffusion locale et une diffusion ciblée ? - Je sais presque

[3]  Analyse et différences entre les principes de multidiffusion et de diffusion - CSDN Blog

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42839065/article/details/131375292
conseillé
Classement