**********************************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.0 到 239.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;
广播组播及转换
最新推荐文章于 2024-09-27 13:30:27 发布