网络编程——广播与多播编程

《网络编程》广播和多播 在网络协议中 IP 地址有三种方式,即为单播地址、广播地址 以及 多播地址。假设多个主机上的共享信道网络是以太网,每个以太网帧包含源主机和目的主机的以太网地址。若目的地址仅指定单个接收接口,则称为单播,在单播方式下,任意两台主机之间的通信不会干扰网内其他主机。若目的地址包含网上的所有主机的接收接口时,即一个主机要向网上所有主机发送帧,则称为广播。若一个主机把帧发送给属于多播组的多个主机,则称为多播。广播和多播仅应用于 UDP,可以将数据报文同时传给多个接收者,而 TCP 是一个面向连接的字节流协议,意味着只 阅读详情

目的

(1)在掌握IP多播的基本概念和工作原理的基础上,进行多播编程,实现多播通信;
(2)在掌握广播的基本概念和工作原理的基础上,进行广播播编程,实现广播通信;

内容

(1)编写一对用于发送和接收信息的IP多播程序,其中: 发送端可向该多播组广播文件中保存的文本信息,接收端可接收传递到该多播组的文本信息。
(2)编写一对用于发送和接收信息的IP多播程序,其中:
发送端可向该多播组广播使用者从键盘输入的即时消息,接收端可接收传递到该多播组的即时消息。
(3)编写一对用于发送和接收信息的广播程序,其中: 发送端可向特定网络广播文件中保存的文本信息,接收端可接收传递到该网络的文本信息。
(4)编写一对用于发送和接收信息的广播程序,其中: 发送端可向特定网络广播使用者从键盘输入的即时消息,接收端可接收传递到该网络的即时消息。

源代码及结果

(1)编写一对用于发送和接收信息的IP多播程序,其中: 发送端可向该多播组广播文件中保存的文本信息,接收端可接收传递到该多播组的文本信息。

//发送端(linux环境下)
//news_sender.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define TTL 64
#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in mul_adr;
	int time_live=TTL;
	FILE *fp;//文件指针
	char buf[BUF_SIZE];

	if(argc!=3){
		printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);
		exit(1);
	}
  	
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&mul_adr, 0, sizeof(mul_adr));
	mul_adr.sin_family=AF_INET;
	mul_adr.sin_addr.s_addr=inet_addr(argv[1]);  // Multicast IP
	mul_adr.sin_port=htons(atoi(argv[2]));       // Multicast Port
	
	setsockopt(send_sock, IPPROTO_IP, 
		IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live));
	
	if((fp=fopen("news.txt", "r"))==NULL)//打开文件
		error_handling("fopen() error");

	while(!feof(fp))   /* Broadcasting */
	{
		fgets(buf, BUF_SIZE, fp);//从文件中读取字符
		sendto(send_sock, buf, strlen(buf), 
			0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));
		sleep(2);
	}
	fclose(fp);//关闭文件
	close(send_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}
//接收端(linux环境下)
//news_receiver.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock;
	int str_len;
	char buf[BUF_SIZE];
	struct sockaddr_in adr;
	struct ip_mreq join_adr;
	
	if(argc!=3) {
		printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);
		exit(1);
	 }
  
	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
 	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);	
	adr.sin_port=htons(atoi(argv[2]));
	
	if(bind(recv_sock, (struct sockaddr*) &adr, sizeof(adr))==-1)
		error_handling("bind() error");
	
	join_adr.imr_multiaddr.s_addr=inet_addr(argv[1]);
	join_adr.imr_interface.s_addr=htonl(INADDR_ANY);
  	
  	//将接收端加入多播组
	setsockopt(recv_sock, IPPROTO_IP, 
		IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));
  
	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;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述

(2)编写一对用于发送和接收信息的IP多播程序,其中: 发送端可向该多播组广播使用者从键盘输入的即时消息,接收端可接收传递到该多播组的即时消息。

//发送端(linux环境下)
//sender.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define TTL 64
#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in mul_adr;
	int time_live=TTL;
	char buf[BUF_SIZE];

	if(argc!=3){
		printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);
		exit(1);
	}
  	
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&mul_adr, 0, sizeof(mul_adr));
	mul_adr.sin_family=AF_INET;
	mul_adr.sin_addr.s_addr=inet_addr(argv[1]);  // Multicast IP
	mul_adr.sin_port=htons(atoi(argv[2]));       // Multicast Port
	
	setsockopt(send_sock, IPPROTO_IP, 
		IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live));
	

	while(1)   /* Broadcasting */
	{
		fputs("please enter:",stdout);
		fgets(buf, BUF_SIZE, stdin);//输入字符串
		sendto(send_sock, buf, strlen(buf), 
			0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));
	}
	close(send_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

//接收端(linux环境下)
//receiver.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock;
	int str_len;
	char buf[BUF_SIZE];
	struct sockaddr_in adr;
	struct ip_mreq join_adr;
	
	if(argc!=3) {
		printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);
		exit(1);
	 }
  
	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
 	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);	
	adr.sin_port=htons(atoi(argv[2]));
	
	if(bind(recv_sock, (struct sockaddr*) &adr, sizeof(adr))==-1)
		error_handling("bind() error");
	
	join_adr.imr_multiaddr.s_addr=inet_addr(argv[1]);
	join_adr.imr_interface.s_addr=htonl(INADDR_ANY);
  	
  	//将接收端加入多播组
	setsockopt(recv_sock, IPPROTO_IP, 
		IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));
  
	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;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述

(3)编写一对用于发送和接收信息的广播程序,其中: 发送端可向特定网络广播文件中保存的文本信息,接收端可接收传递到该网络的文本信息。

//发送端(linux环境下)
//news_sender_brd.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in broad_adr;
	FILE *fp;
	char buf[BUF_SIZE];
	int so_brd=1;//对变量进行初始化以将SO_BROADCAST选项信息改为1
	
	if(argc!=3) {
		printf("Usage : %s <Boradcast IP> <PORT>\n", argv[0]);
		exit(1);
	}
  
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);	
	//广播地址
	memset(&broad_adr, 0, sizeof(broad_adr));
	broad_adr.sin_family=AF_INET;
	broad_adr.sin_addr.s_addr=inet_addr(argv[1]);
	broad_adr.sin_port=htons(atoi(argv[2]));
	//
	setsockopt(send_sock, SOL_SOCKET, 
		SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));	//将SO_BROADCAST选项设置为so_brd变量中的值1
	if((fp=fopen("news.txt", "r"))==NULL)//打开文件
		error_handling("fopen() error");

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

	close(send_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

//接收端(linux环境下)
//news_receiver_brd.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock;
	struct sockaddr_in adr;
	int str_len;
	char buf[BUF_SIZE];
	
	if(argc!=2) {
		printf("Usage : %s  <PORT>\n", argv[0]);
		exit(1);
	 }
  
	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
	
	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);	
	adr.sin_port=htons(atoi(argv[1]));
	
	if(bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr))==-1)
		error_handling("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;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述
在这里插入图片描述

(4)编写一对用于发送和接收信息的广播程序,其中: 发送端可向特定网络广播使用者从键盘输入的即时消息,接收端可接收传递到该网络的即时消息。

//发送端(linux环境下)
//sender_brd.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in broad_adr;
	char buf[BUF_SIZE];
	int so_brd=1;//对变量进行初始化以将SO_BROADCAST选项信息改为1
	
	if(argc!=3) {
		printf("Usage : %s <Boradcast IP> <PORT>\n", argv[0]);
		exit(1);
	}
  
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);	
	//广播地址
	memset(&broad_adr, 0, sizeof(broad_adr));
	broad_adr.sin_family=AF_INET;
	broad_adr.sin_addr.s_addr=inet_addr(argv[1]);
	broad_adr.sin_port=htons(atoi(argv[2]));
	//
	setsockopt(send_sock, SOL_SOCKET, 
		SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));	//将SO_BROADCAST选项设置为so_brd变量中的值1

	while(1)
	{
		fputs("please enter:",stdout);
		fgets(buf, BUF_SIZE, stdin);
		sendto(send_sock, buf, strlen(buf), 
			0, (struct sockaddr*)&broad_adr, sizeof(broad_adr));
		sleep(2);
	}

	close(send_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}
//接收端(linux环境下)
//receiver_brd.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock;
	struct sockaddr_in adr;
	int str_len;
	char buf[BUF_SIZE];
	
	if(argc!=2) {
		printf("Usage : %s  <PORT>\n", argv[0]);
		exit(1);
	 }
  
	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
	
	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);	
	adr.sin_port=htons(atoi(argv[1]));
	
	if(bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr))==-1)
		error_handling("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;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
在这里插入图片描述

拓展

了解了广播与多播的作用,运用原理测试了聊天室功能
多播聊天:

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

#define BUF_SIZE 100
#define TTL 64
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock,send_sock;
	struct sockaddr_in adr;
	struct sockaddr_in mul_adr;
	int time_live=TTL;
	int str_len,len;
	char buf[BUF_SIZE];
	char name[10];             //用户名字
	pid_t pid;
	struct ip_mreq join_adr;
	
	//名字赋值
	len = strlen(argv[3]);
    memcpy(name,argv[3],len);
    memcpy(name+len,":",1);

	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
	
	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);	
	adr.sin_port=htons(atoi(argv[2]));

    send_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&mul_adr, 0, sizeof(mul_adr));
	mul_adr.sin_family=AF_INET;
	mul_adr.sin_addr.s_addr=inet_addr(argv[1]);  // Multicast IP
	mul_adr.sin_port=htons(atoi(argv[2]));       // Multicast Port
	
	setsockopt(send_sock, IPPROTO_IP, 
		IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live));

	
	if(bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr))==-1)
		error_handling("bind() error");
    pid = fork();//创建子进程,子进程用来接收数据,父进程用来发送数据
    if(pid==0)
    {
    	join_adr.imr_multiaddr.s_addr=inet_addr(argv[1]);
	    join_adr.imr_interface.s_addr=htonl(INADDR_ANY);
  	
	    setsockopt(recv_sock, IPPROTO_IP, 
		IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));
		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);
	   }
    }
	else
	{
		while(1){
        	fgets(buf+len+1,sizeof(buf)-len-1,stdin);//输入需要发送的数据
        	memcpy(buf,name,len+1);//加上客户的名字一起广播发送出去
			sendto(send_sock, buf, strlen(buf), 
			0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));
			sleep(2);
		}
	}
	close(send_sock);
	close(recv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
同一局域网下的两台linux(ubantu和kali)
在这里插入图片描述

广播聊天:

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

#define BUF_SIZE 100
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock,send_sock;
	struct sockaddr_in adr;
	int str_len,len;
	char buf[BUF_SIZE];
	char name[10];             //用户名字
	struct sockaddr_in broad_adr;
	int so_brd=1;
	pid_t pid;
	
	//名字赋值
	len = strlen(argv[3]);
    memcpy(name,argv[3],len);
    memcpy(name+len,":",1);

	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
	
	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);	
	adr.sin_port=htons(atoi(argv[2]));

    send_sock=socket(PF_INET, SOCK_DGRAM, 0);	
	memset(&broad_adr, 0, sizeof(broad_adr));
	broad_adr.sin_family=AF_INET;
	broad_adr.sin_addr.s_addr=inet_addr(argv[1]);
	broad_adr.sin_port=htons(atoi(argv[2]));

	setsockopt(send_sock, SOL_SOCKET, 
		SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));
	
	if(bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr))==-1)
		error_handling("bind() error");
    pid = fork();//创建子进程,子进程用来接收数据,父进程用来发送数据
    if(pid==0)
    {
		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);
	   }
    }
	else
	{
		while(1){
        	fgets(buf+len+1,sizeof(buf)-len-1,stdin);//输入需要发送的数据
        	memcpy(buf,name,len+1);//加上客户的名字一起广播发送出去
        	sendto(send_sock, buf, strlen(buf), 
			0, (struct sockaddr*)&broad_adr, sizeof(broad_adr));
		}
	}
	close(send_sock);
	close(recv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

测试结果:
同一局域网下的两台linux(ubantu和kali)
在这里插入图片描述
此程序可以多台统一网段中的电脑进行通信,接受和发送数据在同一程序中,子进程负责进行接收数据,父进程负责发送数据,这样就能既接收数据又能发送数据。

基于Socket实现网络广播的方法 通过Socket,我们可以在不同的计算机之间建立连接,进行数据的传输和通信。在Python中,Socket库提供了对Socket接口的封装,使得我们可以方便地进行网络编程。本文将介绍如何使用Socket库实现基于Socket的网络广播,并提供相应的源代码示例。在进行网络广播之前,我们需要创建一个Socket实例,并将其绑定到一个特定的IP地址和端口号上。在广播时,我们将发送消息到指定的IP地址和端口号,所有连接到该地址和端口的设备都将收到该消息。方法发送广播消息,我们可以向网络中的所有设备发送消息。 阅读详情

相关推荐

Cisco Firepower FMCv修改管理Ip方法

Cisco Firepower FMCv修改管理Ip方法

funnycoffee123的博客 1091

UDP广播的实现

UDP广播编程

weixin_47783699的博客 7663

EnlightenGAN训练复现记录

记录EnlightenGAN过程中的问题和解决方式。提示:以下是本篇文章正文内容,下面案例可供参考。

L_27N113E的博客 3847

网络编程(20)—— 广播的编程实现

一、广播和多播的区别 广播是向同一网络中所有主机传播数据的一种方式。它和多播的主要区别在于: 1、从范围上来说,多播即使在跨越不同网络的情况下,只要加入多播组就能接受数据。而广播只能向同一网络中的主机传输数据(这种网络可以是发送者所在的网络,也可以是发送者所在网络之外的网络)。 2、从接受者的角度来说,接受者在多播中是主动的,接收端需要主动加入多播组,然后才能接受数据。而广播中,对接受者无特别的要求,只要在发送端的目标网络,主机即可接受广播数据。 二、广播的分类 广播分为两种,直接广播和本地广播。二者的主要

web15085181368的博客 1338

2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(3卷)解析

我们先绘制题组中所有设计图我这边作图用的国内的在线作图工具。

2301_76737000的博客 5419

QT+QTimer+QThread实现线程内的定时任务并且和主线程进行交互

在制作qt软件时,我们经常会用到qtimer定时器以及将其在非主线程中进行使用,甚至有的时候还需要和主线程进行交互。我总结了两种用法,仅供参考。以上即为QTimer和QThread联合使用的学习记录。

u011826081的博客 5685

多播(组播)与广播的技术实现

1、组播是基于路由器之上实现的,要想网络内支持组播,需要有能够管理组播组的路由器或是三层交换机(带部分路由功能的交换机)。通常在我们的网络中,都会支持组播,即我们的程序可以使用组播技术,视频会议就使用这个技术。 2、IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。通常选择230之后的地址,使用U...

695

ABB机器人C#二次开发实战:从通信打通到数据读写的落地指南(附完整工程)

最近在做自动化产线升级项目时,遇到一个核心需求:用C#上位机实时读取ABB机器人的关节角度、IO信号,同时下发运动指令和参数配置。翻遍全网,要么是Robot Studio的基础操作教程,要么是C++/VC++的老旧案例,C#相关的实操内容要么只给片段代码,要么跳过通信配置、权限设置等关键步骤,导致刚上手时踩了无数坑——连接超时、数据读不到、写入无响应,甚至误触发机器人安全保护。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1394

day6 广播及实现

数据包发送方式只有一个接受方,称为单播如果同时发给局域网中的所有主机,称为广播只有用户数据报(使用UDP协议)套接字才能广播一个网络内主机号全为1的IP地址为广播地址发到该地址的数据包被所有的主机接收255.255.255.255在所有网段中都代表广播地址、

m0_58066972的博客 623

044、镜头脏污与异物检测:产线 AOI 检测方案与 ISP 脏污补偿

文章摘要(148字) 本文针对镜头生产中的脏污检测问题,提出产线AOI检测与ISP补偿结合的解决方案。产线端采用明场、暗场、偏振三通道联合检测技术,将油污漏检率从8.3%降至0.2%。ISP端通过RAW域局部梯度分析和频域补偿算法,动态修复产线漏检的微小脏污。作者结合实战案例,详细分析了传统灰度阈值法的局限性,并给出多模态检测的代码实现要点,强调必须建立"产线拦截+终端补偿"的双重防护机制。

sundong_81的博客 229

为什么一个“时间片”能折腾 Linux 十年?

时间片扩展不是抢占调度器的控制权,也不是提升优先级。在“非常短暂、非常确定”的用户态临界区内,避免线程被不必要地抢占。用户态自旋锁(user-space spinlock)无系统调用的极短临界区高并发、低延迟的数据结构操作RSEQ(Restartable Sequences)保护区间一旦线程在临界区被抢占,系统整体性能反而下降。线程 A 拿着一个用户态锁线程 B 被调度上来,开始自旋等这个锁但 A 因为时间片用完,被调度器切走CPU 白白空转,所有线程都在浪费时间。

网络技术联盟站 254

TCP/IP网络编程——多播与广播

TCP/IP网络编程——多播与广播

u011895157的博客 2021

如何设计提示词来减少 AI 的幻觉问题?

如何设计提示词来减少 AI 的幻觉问题?

我哎GIS博客 2471

【Linux网络编程】广播与多播

【Linux网络编程】广播与多播 【1】广播 【1.1】概述 不同类型的寻址方式 广播用途 在本地子网定位一个服务器主机即资源发现; 在多客户主机与单服务器主机通信的局域网环境中,尽量减少分组流通; 【1.2】广播地址 标记方法:{子网ID,主机ID},子网ID即由子网掩码覆盖的连续位,主机ID表示以外的位; 特殊的广播地址 子网定向广播地址:{子网ID,-1},通常路由...

CopperSun 技术博客 1186

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux网络编程(十二)——多播与广播

12 多播与广播 12.1 多播 12.1.1 多播的数据传输方式及流量方面的优点 12.1.2 路由(Routing)和 TTL(Time to Live,生存时间)以及加入组的办法 12.1.3 实现多播 Sender 和 Receiver 12.2 广播 12.2.1 广播的理解及实现方法

m0_60875396的博客 891

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

网络编程——多播与广播

参考 《TCP/IP网络编程》 尹圣雨 多播与广播 多播 多播(Multicast)方式的数据传输是基于UDP完成的。与UDP服务器端/客户端的实现方式区别在于,UDP数据传输以单一目标进行,而多播数据同时传递传递到加入(注册)特定组的大量主机 MBone(Multicast Backbone,多播主干网) 多播是基于MBone这个虚拟网络工作的。虚拟网络可以理解为通过网络中的特殊协议工作的软件概念上的网络。即MBone并非可以触及的物理网络。它是以物理网络为基础,通过软件方法实现的多播通信必备虚拟网络

beilizhang的博客 2654

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TCP/IP网络编程_第14章多播与广播

14.1 多播 多播(Multicast)方式的数据传输是基于UDP完成的. 因此, 与UDP服务器/客户端的实现方式非常接近. 区别在于, UDP数据传输以单一目标进行, 而多播数据同时传递到加入(注册)特定组的大量主机. 换言之, 采用多播方式时, 可以同时向多个主机传递数据. 多播的数据传输方式及流量方面的优点 多播的数据传输特点可整合如下. 多播组是D类IP地址(224.0.0.0 ~ 239.255.255.255), "加入多播组"可以理解为通过程序完成如下声明: 多播是基于UDP完成的,.

weifc-wei 的博客 773

《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播

《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播

ProgramNovice的博客 1292

Linux网络编程 - 多播与广播

本篇博文主要讲解多播与广播的基本概念以及基于多播与广播的网络编程实现方法。

yunfan 2414

《TCP/IP网络编程》多播与广播-第14章

不同:多播可以跨网络传输,只传给加入某个多播组的主机,更具选择性和效率。相反,广播组只能在同一子网/局域网同一网络中传输,传送给该网络中的全部主机。“虚拟网络”意味着它不需要物理上的独立网络结构,而是通过软件隧道和特定协议(如 DVMRP、PIM)在现有网络中建立逻辑通路,实现多播通信。相同:都可以给多个主机传输相同数据报,并且发送端只需传输一次,然后由路由器进行复制发送多个主机,实现“一对多”通信。2多播对于加入多播组的主机均发送数据包,后加入的主机无法收到之前的信息,发送端无需重发数据。

2401_86994729的博客 524

《UNIX 网络编程-卷1》阅读笔记21: 广播与多播

第二十章探讨的是网络通信中的两种“一对多”模式——广播(Broadcasting)和多播(Multicasting)。在前面章节的学习中,我们接触的都是单播(Unicast)通信——一个进程与另一个进程进行点对点通信。TCP协议只支持这种寻址方式。然而,许多网络应用需要将同一份数据发送给多个接收者,例如:视频直播、网络游戏的状态同步、服务发现(ARP、DHCP)、金融行情推送等。广播和多播正是为解决“一对多”通信问题而生的,它们只能用于UDP或原始IP。

1411

java socket 广播_java_简单讲解Java的Socket网络编程的多播与广播实现,在Java中,我们可以有很多种方 - phpStudy...

简单讲解Java的Socket网络编程的多播与广播实现在Java中,我们可以有很多种方法来发送和接收数据。有的方法比较靠近底层,有些问题就需要程序员自己去解决,而有些方法抽象层次比较高,很方便地就可以拿来使用。这些处理数据的方法根据抽象层次由低到高分别有:1.手动编码:使用位运算逐个自己编码和解析。2.利用流来自动编码:组合使用OutputStream和ByteArrayOutputStream。...

weixin_29343349的博客 259

(TCP IP网络编程)实验三 广播和多播编程

一.实验目的 (1) 在掌握IP多播的基本概念和工作原理的基础上,进行多播编程,实现多播通信; (2) 在掌握广播的基本概念和工作原理的基础上,进行广播播编程,实现广播通信; 二.实验内容 (1)编写一对用于发送和接收信息的IP多播程序,其中: 发送端可向该多播组广播文件中保存的新闻信息,接收端可接收传递到该多播组的新闻信息。 (2)编写一对用于发送和接收信息的IP多播程序,其中: 发送端可向该多播组广播使用者从键盘输入的即时消息,接收端可接收传递到该多播组的即时消息。 (3)编写一对用于发送和接收信

weixin_44209522的博客 1953

Python----Python高级(网络编程:网络高级:多播和广播,C/S架构,TCP,UDP,网络编程)

Python----Python高级(网络编程:网络高级:多播和广播,C/S架构,TCP,UDP,网络编程)

weixin_64110589的博客 1815
上一篇: 网络编程——数据报套接字编程
下一篇: 网络编程——进程编程
DiliLearngent
博客等级 码龄7年 977粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值