[TCP/IP] Definição de Broadcast, Princípio e Implementação de Programação

        Este artigo tem um total de 2.974 palavras e o tempo estimado de leitura é de 4 minutos.

Índice

transmissão

Princípios e formas de transmissão

Programação e Implementação de Radiodifusão

Configurações de opções de soquete

remetente

receptor

Expandir informações


transmissão

        Broadcast refere-se a um método de transmissão no qual, quando pacotes são transmitidos em uma rede de computadores, o endereço de destino são todos os dispositivos da rede. Os "todos os dispositivos" mencionados aqui também estão limitados a um intervalo chamado "domínio de transmissão".

        Com base nas características da transmissão, a transmissão geralmente é usada em LAN, mas não em WAN.

Princípios e formas de transmissão

        O protocolo de transmissão de dados do multicast é o mesmo do multicast, que é concluído através do protocolo UDP. Ao mesmo tempo, a radiodifusão divide-se em duas formas, a saber:

  • Transmissão direta (transmissão que pode abranger diferentes redes)
  • Transmissão local (transmissão apenas dentro da rede local)

        A transmissão direta é usada para transmitir dados para um host em uma área específica (o endereço de rede do host alvo é conhecido). Em uso, se o endereço IP e a máscara de sub-rede do host de destino forem 192.168.1.0/24 , o endereço de transmissão será 192.168.1.255 . (Deve-se observar que 255.255.255.255 é um endereço de broadcast restrito e não pode ser usado.) Ao enviar um pacote de dados de acordo com este endereço, o roteador enviará o pacote de dados para todos os hosts em 192.168.1.1 ~ 192.168.1.254 , conforme mostrado na figura abaixo Mostrar:

        A transmissão local é usada para comunicação dentro da rede local (só pode ser usada em LAN). Não importa em qual rede IP um host específico esteja, o host atual sempre poderá usar o endereço 255.255.255.255  para enviar pacotes para todos os nós da rede local. Por exemplo, se qualquer host no segmento de rede 192.168.0 enviar um pacote de dados para 255.255.255.255 ,todos os hosts no segmento de rede 192.168.0 Como mostrado abaixo:

expandir:

        Como saber a qual domínio de broadcast um host pertence?

        Você pode saber a qual domínio de broadcast o host pertence executando uma operação AND no endereço IP e na máscara de sub-rede do host.

        Por exemplo: o endereço IP de um host é 192(1100 0000).168(1010 1000).23(0001 0111).150(1001 0110) e a máscara de sub-rede é 255(1111 1111).255.255.0, então O domínio de transmissão ao qual pertence é (o cálculo real está em binário ~):

192.168.23.150 \cunha 255.255.255.0 = 192.168.23.0

        Então, todos os outros hosts no domínio de transmissão 192.168.23.0 poderão receber os pacotes de transmissão enviados pelo dispositivo.

expandir:

        Como calcular o endereço de transmissão?

        O endereço de broadcast é calculado “invertendo” a máscara de sub-rede e então realizando uma “operação OR” com o domínio de broadcast.
        Por exemplo: o domínio de transmissão ao qual o host pertence atualmente é 192(1100 0000).168(1010 1000).0.0, e a máscara de sub-rede é 255.255.0.0, então o endereço de transmissão é (é uma operação OR, ou seja \vee, |; \simé ​​uma operação inversa):

192.168.0.0 \vee (\sim255.255.0.0) = 192.168.255.255

Programação e Implementação de Radiodifusão

Configurações de opções de soquete

        A implementação da programação de broadcast é semelhante ao multicast, a diferença está na configuração das opções de soquete. Através da função setcokopt , defina o nível de opção como  SOL_SOCKET  , e a opção correspondente é  SO_BROADCAST  . A opção está definida como 1, o que significa "a transmissão de dados é possível".

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));

remetente

        A implementação é semelhante ao multicast, focando principalmente na configuração de opções de soquete.

#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;
}

receptor

#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;
}

resultado da operação:

Expandir informações

[1]  Explicação detalhada das funções e parâmetros da função setsockopt - Blog Park 

[2]  Qual é a diferença entre transmissão local e transmissão direcionada? - Sabe quase

[3]  Análise e diferenças entre princípios multicast e broadcast - CSDN Blog

Acho que você gosta

Origin blog.csdn.net/weixin_42839065/article/details/131375292
Recomendado
Clasificación