c/c++:UDP(udp通信、广播、组播),本地套接字

目录

1. udp

1.1 udp通信流程

1.2 操作函数

send、sendto

recv、recvfrom

2. 广播

2.1 广播通信流程

2.2 设置广播属性函数:setsockopt

2.3 广播代码

3 组播

3.1 组播地址

3.2 组播通信流程

3.3 设置组播属性函数:setsockopt

3.4 组播代码

4. 本地套接字

4.1 结构体sockaddr_un 

4.2 本地套接字—进程间通信流程

4.3 本地套接字—进程间通代码


 

 

1. udp

 

1.1 udp通信流程

  • - 服务器端

    - 1.创建通信的套接字
         - int fd = socket( af_inet, SOCK_DGRAM, 0)
    - 2. 绑定 -> 通信的fd 和本地 IP / port 绑定
           - struct sockaddr_in addr;
    - 3.通信
          - 接收数据: recvfrom
          - 发送数据: sendto
    - 4.关闭通信的fd
         - close(fd);

  •   - 客户端

    - 1.创建一个通信的套接字
    - 2.通信
         - 接收数据: recvfrom
         - 发送数据: sendto
    - 3.关闭通信的文件描述符
         - close();

 

1.2 操作函数

  • send、sendto

#include <sys/types.h>
#include <sys/socket.h>

#include <arpa/inet.h>   //也可以只用这一个头文件,包含了上面2个头文件

  // tcp 发送数据的函数 write
  ssize_t send(int sockfd, const void *buf, size_t len, int flags);

  // udp 发送数据
  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: 要发送的数据的长度
  		- flags: 0
          - dest_addr: 通信的另外一端的地址信息
          - addrlen: dest_addr的内存大小

 

  • recv、recvfrom

#include <sys/types.h>
#include <sys/socket.h>

#include <arpa/inet.h>   //也可以只用这一个头文件,包含了上面2个头文件

  // tcp 接收数据 read
  ssize_t recv(int sockfd, void *buf, size_t len, int flags);

  // udp 接收数据函数
  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: src_addr参数对应内存大小(传入传出参数)
                  
   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

 

2. 广播

向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息。

 

  • 只能在局域网中使用
  • 客户端只要绑定了服务器广播使用的端口, 就可以接收到广播数据

 

2.1 广播通信流程

服务器端 -> 广播的一端: 

  • - 创建通信的套接字

              int fd = socket( af_inet, SOCK_DGRAM, 0);

  • - 设置udp广播属性

                  setsockopt();

  • - 通信 -> 发送广播数据

                struct sockaddr_in cliaddr;
                cliaddr.sin_port(8888);    // 广播数据发送到客户端的8888端口, 客户端需要绑定该端口
                cliaddr.sin_addr.s_addr -> 初始化一个广播地址
               发送数据: sendto(fd, buf, len, 0, &cliaddr, len);

  • - 关闭通信的fd

              close(fd);

客户端

  • - 创建一个通信的套接字

                  int fd = socket( af_inet, SOCK_DGRAM, 0);

  • - 如果想接收广播数据, 需要绑定以固定端口(服务器广播数据使用的端口)

                struct sockaddr_in cliaddr;
                cliaddr.sin_port(8888);    
                bind(fd, cliaddr, len);<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值