Este artículo tiene un total de 2974 palabras y el tiempo estimado de lectura es de 4 minutos.
Tabla de contenido
Principios y formas de radiodifusión.
Programación e Implementación de Radiodifusión
Configuración de opciones de enchufe
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 ~):
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 , |; es una operación inversa):
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