c++ webserver/第四章 UDP通信

本文详细介绍了UDP间通信的流程图和关键函数,包括广播和组播的概念、特点、如何设置广播属性和加入组播组。讨论了组播地址的分类及在局域网和广域网的应用。此外,还涵盖了本地套接字的定义与操作,以及如何处理重复连接问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. UDP间通信

1.流程图

2.函数
#include <sys/types.h>
#include <sys/socket.h> 
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
/*
- 参数:
	- sockfd : 通信的fd 
	- buf : 要发送的数据
    - len : 发送数据的长度,字符串结束符也要发送,所有一般是sizeof(buf) + 1
    - flags : 0 
    - dest_addr : 通信的另外一端的地址信息
    - addrlen : 地址的内存大小
*/  


ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
/*
参数:
	- sockfd : 通信的fd 
	- buf : 接收数据的数组 
	- len : 数组的大小
	- flags : 0
    - src_addr : 用来保存另外一端的地址信息,不需要可以指定为NULL(客户端).传出参数
    - addrlen : 地址的内存大小
*/


2.广播

向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。

a.只能在局域网中使用。

b.客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。

// 设置广播属性的函数
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
	- sockfd : 文件描述符
   	- level : SOL_SOCKET
   	- optname : SO_BROADCAST
    - optval : int类型的值,为1表示允许广播
    - optlen : optval的大小
        
        
//发送到广播地址   ip = 网络号+主机号(全1); 端口号自己指定,但是客户端也需要绑定端口号(相同的端口号 )

3.组播(多播)

单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),**多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,也就是说由运行相应多播会话应用系统的主机上的接口接收。**另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。

a.组播既可以用于局域网,也可以用于广域网

b.客户端需要加入多播组,才能接收到多播的数据

2.组播地址

IP 多播通信必须依赖于 IP 多播地址,在 IPv4 中它的范围从 224.0.0.0 到 239.255.255.255 ,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkjbfTI0-1646740476307)(第四章 UDP通信.assets/image-20220307173112034.png)]

3.设置组播
// 服务器设置多播的信息,外出接口
 int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen); 
	- level : IPPROTO_IP
    - optname : IP_MULTICAST_IF0000
    - optval : struct in_addr
        
        
// 客户端加入到多播组:
   - level : IPPROTO_IP
   - optname : IP_ADD_MEMBERSHIP		//加入多播组
   - optval : struct ip_mreq
       
       
struct ip_mreq
{ 
    /* IP multicast address of group. */
    struct in_addr imr_multiaddr; // 组播的IP地址		记得转网络字节序
    
    /* Local IP address of interface. */ 
    struct in_addr imr_interface; // 本地的IP地址 		INADDR_ANY
};

typedef uint32_t in_addr_t; 
struct in_addr 
{
    in_addr_t s_addr;
};

4.本地套接字

1.定义

完成本地进程间通信

​ 有关系的进程间通信(父子进程)

​ 没有关系的进程间通信

2.流程
实习流程与网络类型(用TCP通信流程)

//1.创建监听的套接字
int lfd = socket(AF_UNIX/AF_LOCAL,SOCK_STREAM,0);

//2.监听的套接字绑定的套接字文件 -> server端
//绑定成功之后,指定结构体的sun_path中的套接字文件会自动生成。
struct sockaddr_un addr;
bind(lfd,addr,len);

//3.监听
listen(lfd,100)
 
//4.等待并接受连接请求
struct sockaddr_un cliaddr;
int cfd = accept(lfd,&cliaddr,len);

//5.通信
read/recv
write/send
    
//6.关闭
    
    
    
    
// 客户端的流程 
1. 创建通信的套接字
int fd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);

2. 监听的套接字绑定本地的IP 端口
 struct sockaddr_un addr; 
strcpy(addr.sum_path,"名字.sock");	//生成 名字.sock文件,用于通信
// 绑定成功之后,指定的sun_path中的套接字文件会自动生成。 
bind(lfd, addr, len);

3. 连接服务器
struct sockaddr_un serveraddr;
connect(fd, &serveraddr, sizeof(serveraddr));

4. 通信
接收数据:read/recv
发送数据:write/send
    
5. 关闭连接 close();
//头文件: sys/un.h 

#define UNIX_PATH_MAX 108 

struct sockaddr_un { 

sa_family_t sun_family; // 地址族协议 af_local 

char sun_path[UNIX_PATH_MAX]; // 套接字文件的路径, 这是一个伪文件, 大小永远=0 

};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-759Zwkb2-1646740476309)(第四章 UDP通信.assets/image-20220308140609097.png)]

3.每次连接都需要把上一次的删除,否则就会产生占用
unlike("const char* path");	//删除连接文件,写在开头即可

th[UNIX_PATH_MAX]; // 套接字文件的路径, 这是一个伪文件, 大小永远=0

};


[外链图片转存中...(img-759Zwkb2-1646740476309)]

#### 3.每次连接都需要把上一次的删除,否则就会产生占用

~~~cpp
unlike("const char* path");	//删除连接文件,写在开头即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

公仔面i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值