广播组播及转换

**********************************UDP广播*************************************

广播域: 
是网络中能接收任一台主机发出的广播帧的所有 【主机】 集合
如果广播域内的其中一台主机发出一个广播帧,同一广播域内所有的其它主机都可以收到该广播帧。

广播域为主机的IP地址和 子网掩码(255.255.255.0)与运算。192.168.23.150&255.255.255.0=192.168.23.0
广播地址为广播域和 取反子网掩码(0.0.0.255)或运算。		192.168.23.0&0.0.0.255=192.168.23.255

主机A发送的广播包被另一网段的主机B收到,需要更改主机A的子网掩码使得与主机B在同一个广播域内,
再使用新的广播域的广播地址发送广播包即可。

*******		*******		*******		*******		*******		*******		*******		*******

int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
sockfd		--->将要被设置或者获取选项的套接字。
level		--->选项所在的协议层。
		SOL_SOCKET		--->通用套接字选项.
		IPPROTO_IP		--->IP选项.
		IPPROTO_TCP		--->TCP选项.
optname		--->须要訪问的选项名,常用的有以下选项
		SO_BROADCAST      同意发送广播数据          
		SO_RCVBUF        接收缓冲区大小           
		SO_SNDBUF        发送缓冲区大小           
optval		--->对于getsockopt(),指向返回选项值的缓冲。
						对于setsockopt(),指向包括新选项值的缓冲。
		1		--->使能
		0		--->关闭使能
optlen		--->对于getsockopt(),作为入口參数时,选项值的最大长度。作为出口參数时,选项值的实际长度。
						对于setsockopt(),现选项的长度。
返回值: 成功		--->0	失败 		--->-1
功能
	 获取或者设置与某个套接字关联的选项。选项可能存在于多层协议中
	 当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该将层的值指定为SOL_SOCKET。
	 为了操作其他层的选项,控制选项的合适协议号必须给出。比如,为了表示一个选项由TCP协议解析,层应该设定为协议号TCP
			
			举例
				//设置套接字选项SO_BROADCAST,使能广播
				int on = 1;							
				setsockopt(sock,SOL_SOCKET, SO_BROADCAST,(void *)&on , sizeof(on));
			
				// 接收缓冲区
				int nRecvBuf=32*1024;         //设置为32K
				setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
				
				//发送缓冲区
				int nSendBuf=32*1024;//设置为32K
				setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
				注意 
					O_RCVBUF选项必须在connect之前设置;对于server,SO_RCVBUF选项必须在listen前设置。
					
谁要广播谁就使用setsockopt函数,并且第4个参数变量地址内设置为1
取消广播就使用setsockopt函数将第4个参数变量地址内设置为0
要想接收到广播信号,必须是同一个端口号
同一台机器上面的应用程序的端口号不可以一样


**********************************UDP组播(多播)*************************************

多播地址IPv4 中它是一个 D 类 IP 地址,范围从 224.0.0.0239.255.255.255
并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:
	(1)局部链接多播地址范围在 224.0.0.0~224.0.0.255,
	这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;
	(2)预留多播地址为 224.0.1.0~238.255.255.255,
	可用于全球范围(如Internet)或网络协议;
	(3)管理权限多播地址为 239.0.0.0~239.255.255.255,
	可供组织内部使用,类似于私有 IP 地址,不能用于 Internet,可限制多播范围。
				
注意!!!
	要支持多播,需要设置路由
	route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
	route add default gw 192.168.31.1 dev eth0

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
参数
	sockfd		--->将要被设置或者获取选项的套接字。
	level		--->选项所在的协议层。
					IPPROTO_IP		--->IP选项
	optname		--->须要訪问的选项名,常用的有以下选项
						IP_ADD_MEMBERSHIP		--->加入多播组
						IP_DROP_MEMBERSHIP		--->离开多播组         
	optval		--->对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包括新选项值的缓冲。
						1		--->使能
						0		--->关闭使能
	optlen		--->对于getsockopt(),作为入口參数时,选项值的最大长度。作为出口參数时,选项值的实际长度。对于setsockopt(),现选项的长度。
返回值 
	成功		--->0
	失败 		--->-1	

UDP组播(多播)相关结构体************************
struct in_addr
{
	in_addr_t s_addr;
}

struct ip_mreq         //in.h    
{ 
	struct in_addr imn_multiaddr; 	// 多播组 IP,类似于 QQ 群号
	struct in_addr imr_interface;   // 将要添加到多播组的 IP,类似于QQ号
};				
*****		*******	*******	******		*******	********	
******************************************************
struct sockaddr_in
{
	short int sin_family;
	unsigned short int sin_port;
	struct in_addr
	{
		unsigned long s_addr;
	};
	unsigned char sin_zero[8];
};
struct sockaddr
{
	unsigned short sa_family;
	char sa_data[14];
};
********************************************************

**********************************网络字节序转换***********************************
网络字节顺序 (Network Byte Order)      	NBO
结构体的sin_port和sin_addr都必须是NBO

本机字节顺序 (Host Byte Order)    		HBO
一般可视化的数字都是HBO

NBO,HBO二者转换
(1)inet_addr()    	将字符串点数格式地址转化成无符号长整型(unsigned long s_addr s_addr;)
(2)inet_aton()    	将字符串点数格式地址转化成NBO
(3)inet_ntoa ()     将NBO地址转化成字符串点数格式
(4)htons()    		"Host to Network Short"
(5)htonl()    		"Host to Network Long"
(6)ntohs()    		"Network to Host Short"
(7)ntohl()    		"Network to Host Long"

(8)注意
	htons/htonl和ntohs/ntohl等数字转换都不能用于地址转换,
	因为地址都是点数格式,所以地址只能采用数字/字符串转换如inet_aton,inet_ntoa;
(9)举例
	给地址赋值的几种方法
		inet_aton("192.168.1.100",&server_addr.sin_addr);
		server_addr.sin_addr.s_addr = inet_addr("192.168.1.100");
		server_addr.sin_addr.s_addr = htons(INADDR_ANY);  //INADDR_ANY转不转NBO随便
		server_addr.sin_addr.s_addr = INADDR_ANY;
	给端口赋值的几种方法
		#define MYPORT 8000 
		server_addr.sin_port = htons(MYPORT);
		
		server_addr.sin_port = htons(0);	//0(随机端口)转不转NBO随便
		server_addr.sin_port = 0;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一如既往の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值