Linux网络编程之扩展-下

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编程)步骤

一、服务器端
在这里插入图片描述
二、客户端
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值