[TCP/IP] Definición de transmisión, principio e implementación de programación

        Este artículo tiene un total de 2974 palabras y el tiempo estimado de lectura es de 4 minutos.

Tabla de contenido

transmisión

Principios y formas de radiodifusión.

Programación e Implementación de Radiodifusión

Configuración de opciones de enchufe

remitente

receptor

Ampliar información


transmisión

        La difusión se refiere a un método de transmisión en el que cuando los paquetes se transmiten en una red informática, la dirección de destino son todos los dispositivos de la red. Los "todos los dispositivos" mencionados aquí también están limitados a un rango, que se denomina "dominio de transmisión".

        Según las características de la transmisión, la transmisión generalmente se usa en LAN pero no en WAN.

Principios y formas de radiodifusión.

        El protocolo de transmisión de datos de multidifusión es el mismo que el de multidifusión, que se completa mediante el protocolo UDP. Al mismo tiempo, la radiodifusión se divide en dos formas, a saber:

  • Transmisión directa (transmisión que puede abarcar diferentes redes)
  • Transmisión local (transmisión solo dentro de la red local)

        La transmisión directa se utiliza para transmitir datos a un host en un área específica (se conoce la dirección de red del host de destino). En uso, si se sabe que la dirección IP y la máscara de subred del host de destino son 192.168.1.0/24 , entonces la dirección de transmisión es 192.168.1.255 . (Cabe señalar que 255.255.255.255 es una dirección de transmisión restringida y no se puede usar). Al enviar un paquete de datos de acuerdo con esta dirección, el enrutador enviará el paquete de datos a todos los hosts bajo 192.168.1.1 ~ 192.168.1.254 , como como se muestra en la siguiente figura Mostrar:

        La transmisión local se utiliza para la comunicación dentro de la red local (solo se puede utilizar en LAN). No importa en qué red IP se encuentre un host en particular, el host actual siempre puede usar la dirección 255.255.255.255  para enviar paquetes a cada nodo de la red local. Por ejemplo, si cualquier host en el segmento de red 192.168.0 envía un paquete de datos a 255.255.255.255 , entoncestodos los hosts en el segmento de red 192.168.0 Como se muestra abajo:

expandir:

        ¿Cómo saber a qué dominio de transmisión pertenece un host?

        Puede saber a qué dominio de transmisión pertenece el host realizando una operación AND en la dirección IP y la máscara de subred del host.

        Por ejemplo: la dirección IP de un host es 192(1100 0000).168(1010 1000).23(0001 0111).150(1001 0110), y la máscara de subred es 255(1111 1111).255.255.0, entonces it El dominio de transmisión al que pertenece es (el cálculo real está en binario ~):

192.168.23.150 \cuña 255.255.255.0 = 192.168.23.0

        Luego, todos los demás hosts en el dominio de transmisión 192.168.23.0 pueden recibir los paquetes de transmisión enviados por el dispositivo.

expandir:

        ¿Cómo calcular la dirección de transmisión?

        La dirección de transmisión se calcula "invirtiendo" la máscara de subred y luego realizando una "operación OR" con el dominio de transmisión.
        Por ejemplo: el dominio de transmisión al que pertenece actualmente el host es 192 (1100 0000). 168 (1010 1000). 0.0, y la máscara de subred es 255.255.0.0, entonces la dirección de transmisión es (es una operación O, es decir \vee, |; \simes una operación inversa):

192.168.0.0 \vee (\sim255.255.0.0) = 192.168.255.255

Programación e Implementación de Radiodifusión

Configuración de opciones de enchufe

        La implementación de la programación de transmisión es similar a la de multidifusión, la diferencia radica en la configuración de las opciones de socket. A través de la función setcokopt , establezca el nivel de opción en  SOL_SOCKET  y la opción correspondiente es  SO_BROADCAST  . La opción está configurada en 1, lo que significa "es posible la transmisión de datos".

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

remitente

        La implementación es similar a la multidifusión y se centra principalmente en la configuración de opciones 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;
}

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 de la operación:

Ampliar información

[1]  Explicación detallada de las funciones y parámetros de la función setsockopt - Blog Park 

[2]  ¿Cuál es la diferencia entre transmisión local y transmisión dirigida? - Saber casi

[3]  Análisis y diferencias entre los principios de multidifusión y difusión - Blog CSDN

Supongo que te gusta

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