1.17号网络

网络属性

1> 对于套接字而言,在不同的层中,可以设置不同的属性,如端口号快速重用、超时时间、设置广播、加入多播组等等

2> 关于网络属性,有两个函数,分别是 setsockopt、getsockopt

 #include          /* See NOTES */
 #include

       int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
       功能:获取网络属性
       参数1:套接字文件描述符
       参数2:套接字要设置的层次
               应用层:SOL_SOCKET
               tcp传输层:IPPROTO_TCP
               udp传输层: IPPROTO_UDP
               网络层:IPPROTO_IP
        参数3:指定层内的属性,见下表
        参数4:存放该属性的容器起始地址
        参数5:参数4的大小
        返回值:成功返回0,失败返回-1并置位错误码
        
        
       int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
       功能:设置网络属性
       参数1:套接字文件描述符
       参数2:套接字要设置的层次
               应用层:SOL_SOCKET
               tcp传输层:IPPROTO_TCP
               udp传输层: IPPROTO_UDP
               网络层:IPPROTO_IP
        参数3:指定层内的属性,见下表
        参数4:设置该属性的容器起始地址
        参数5:参数4的大小
        返回值:成功返回0,失败返回-1并置位错误码

多点通信

单播

1> 单播发生在主机之间一对一的通信模式,交换机或者路由器只对数据进行转发,不做复制

2> 每次只有两个实体之间进行相互通信,发送端和接收端都是唯一确定的

广播

1> 主机之间的一对多的通信模式,网络对其中的每一台主句发出的信息都进行复制并转发

2> 所有主机都可以收到广播消息(无论你是否愿意接收),所以,广播是基于UDP通信模式

3> 广播地址:网络号 + 255

例如:主机地址为192.168.125.171 ---> 192.168.125.255

4> 广播消息是不能穿过路由器的,也就是说广播消息禁止在外网上进行传播,所以广播只能完成局域网内的多点通信

广播的发送端模型 ----> 类似于UDP的客户端

1> socket 创建套接字

2> setsockopt 设置网络属性,允许广播

3> bind 非必须绑定

4> 填充接收端地址信息结构体

ip:填广播地址(192.168.125.255)

port:与接收端保持一致

5> sendto 发送消息

6> close 关闭套接字

广播的接收端模型 ----> 类似于UDP的服务器端

1> socket 创建套接字

2> 填充地址信息结构体

ip:广播地址

port:与发送端保持一致

3> bind 绑定端口号与ip地址

4> recvfrom 接收消息

5> close 关闭套接字

组播

1> 组播也是实现主机之间一对多的通信模型,跟广播不同的是,组播发送的消息,只有加入多播组的成员才能收到,没有加入的就无法收到,不会占用柜台对的网络带宽

2> 组播也是使用UDP实现

3> 组播地址:就是D类网络,224.0.0.0 -- 239.255.255.255

组播的发送端模型 --->类似于UDP的客户端

1> socket 创建套接字

2> bind 非必须绑定

3> 填充接收端地址信息结构体

ip:组播地址,与接收端保持一致

port:与接收端保持一致

4> sendto 发送组播消息

5> close 关闭套接字

组播的接收端模型 ---> 类似于UDP的服务器

1> socket 创建套接字

2> setsockopt 设置网络属性

设置层级:IPPROTO_IP

设置属性:IP_ADD_MEMBERSHIP

属性类型:

struct ip_mreqn {

struct in_addr imr_multiaddr; /* IP multicast group address / //组播ip地址

struct in_addr imr_address; / IP address of local interface / //本地IP地址

int imr_ifindex; / interface index */ 网络索引 0表示使用默认网络索引

ip ad:查看自己的网卡索引号 ens33 ---> 2

};

3> 填充地址信息结构体

ip:组播IP,与发送端保持一致

port :与发送端保持一致

4> bind 必须绑定

5> recvfrom 接收消息

6> close 关闭套接字

域套接字相关概念

1> 只能在同一主机之间完成多个进程间的通信方式,是最原始的套接字通信模型

2> 由于不需要借助网络,所以在通信时,无需使用ip地址和端口号

3> 会在内核空间使用 套接字文件 进行通信

4> bcd-lsp 中的s,说的就是套接字文件类型

5> socket函数的说明

流式域套接字

1> 基于TCP通信原理,面向连接的通信方式

2> bind函数,只能绑定一个不存在的套接字文件,如果绑定的套接字文件存在,则bind函数报错:Address already in use

3> 对于客户端而言,如果不绑定一个套接字文件,系统不会给客户端绑定套接字文件

流式域套接字服务器端实现

流式域套接字客户端实现

报式域套接字

1> 基于UDP面向无连接的通信方式

2> 如果客户端没有绑定套接字,系统不会为其绑定套接字文件,当服务器想要给客户端发消息时:怎么办?

报式域套接字服务器端

报式域套接字客户端

你可能感兴趣的:(笔记)