1 广播
1.1 广播相关概念
一、单播
前面介绍的数据包发送方式只有一个接受方,称为单播。
二、广播
同时发给局域网中的所有主机,称为广播。只有用户数据报(使用UDP协议)套接字才能广播。
三、广播地址
1、以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址。
2、发到该地址的数据包被所有的主机接收。
3、255.255.255.255在所有网段中都代表广播地址。
四、广播特点
1、一对多(一个设备发送,局域网内所有设备都能接收到);
2、只能使用UDP编程;
3、广播是注意防范网络风暴,慎用(其实很多路由器是禁止广播的)。
1.2广播发送
广播发送相当于客户端Client。
1.2.1广播发送操作步骤
一、创建用户数据报套接字
缺省创建的套接字不允许广播数据包,需要用setsockopt () 函数设置套接字属性。
二、指定接收方地址指定为广播地址。
三、指定端口信息。
四、发送数据包。
1.2.2 广播相关函数
一、套接字属性修改函数
1、函数原型
<sys/socket.h>
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
2、参数
A、level : 选项级别(例如SOL_SOCKET);
B、optname : 选项名(例如SO_BROADCAST);
C、optval : 存放选项值的缓冲区的地址;
D、optlen : 缓冲区长度;
3、返回值
成功返回0 失败返回-1并设置errno。
1.2.3 广播示例
sockfd = socket(,);
……
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); // 套接字属性修改。
……
sendto(;;;;😉;
1.3广播接收
广播接收相当于服务器端Server。
1.3.1广播接收操作步骤
一、创建用户数据报套接字
二、绑定本机IP地址和端口
绑定的端口必须和发送方指定的端口相同。
三、等待接收数据
2 组播
2.1 组播相关概念
一、组播(又称为多播),和广播比是一种折中的方式。只有加入某个多播组的主机才能收到数据。
二、组播特点
1、一对多(一个设备发送,多播组内所有设备都能接收到)。
2、只能使用UDP编程。
3、多播方式既可以发给多个主机,又能避免像广播那样带来过多的负载和引起网络风暴。
2.2 组播地址
一、网络地址分类
A类地址
第1字节为网络地址,其他3个字节为主机地址。第1字节的最高位固定为0
1.0.0.1 – 126.255.255.255
B类地址
第1字节和第2字节是网络地址,其他2个字节是主机地址。第1字节的前两位固定为10
128.0.0.1 – 191.255.255.255
C类地址
前3个字节是网络地址,最后1个字节是主机地址。第1字节的前3位固定为110
192.0.0.1 – 223.255.255.255
D类地址(组播地址)
不分网络地址和主机地址,第1字节的前4位固定为1110
224.0.0.1 – 239.255.255.255
二、组播地址
以上的D类地址才是组播地址。
2.3 组播发送
**组播发送相当于客户端Client,**组播发送步骤如下:
一、创建用户数据报套接字。
二、指定接收方地址为组播地址。
三、指定端口信息。
四、发送数据包。
2.4 组播接收
组播接收相当于服务器端Server。
2.4.1 组播接收步骤
一、创建用户数据报套接字
二、加入多播组
三、绑定本机IP地址和端口
绑定的端口必须和发送方指定的端口相同。
四、等待接收数据
2.4.1 加入组播组过程
一、结构体类型
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
二、创建结构体并清零、赋值
struct ip_mreq mreq;
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(“235.10.10.3”);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
三、加入组播组
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
sizeof(mreq));
3 UNIX域套接字
3.1 进程间通信方式总结
一、UNIX域套接字也属于进程间通信(本地通信)
套接字Socket不仅应用于网络通信,也能应用于进程间本地通信。unix域套接字和其他进程间通信方式相比使用方便、效率更高。常用于前后台进程通信。
、进程间通信方式总结1、数据共享方式
管道;消息队列;共享内存;unix域套接字。
A、易用性排序:消息队列>unix域套接字>管道>共享内存(经常和信号量配合使用)。
B、效率排序:共享内存>unix域套接字>管道>消息队列。
C、常用的数据共享方式:共享内存和unix域套接字。
2、异步通信方式
信号
3、同步或互斥机制(资源保护)
信号量;信号量集。
注:信号与信号量(信号量集)差别很大,要注意区分。
3.2 UNIX域套接字通信分类
3.2.1 UNIX域套接字地址
一、本地地址结构
struct sockaddr_un // <sys/un.h>
{
sa_family_t sun_family;
char sun_path[108]; // Unix套接字文件的路径,这个文件在内核中,必须平时不存在,一般给绝对路径。
};
二、填充地址结构
struct sockaddr_un myaddr;
bzero(&myaddr, sizeof(myaddr));
myaddr.sun_family = AF_UNIX;
strcpy(myaddr.sun_path, “/tmp/mysocket”);
3.2.2 流式套接字通信(TCP编程)步骤
一、服务器端
1、socket(AF_UNIX, SOCK_STREAM, 0);
2、bind(,本地地址,);
3、listen(,);
4、accept(,,);
5、recv() / send();
二、客户端
1、socket(PF_UNIX, SOCK_STREAM, 0);
2、bind(,本地地址, ); // 可选。
3、connect(,,);
4、recv() / send();
3.2.3 用户数据包套接字通信(UDP编程)步骤
一、服务器端
二、客户端