UDP广播和 TCP 协议

1. UDP 广播

1.1 UDP 概述

UDP 广播是一种网络通信方式,允许将数据发送到网络中的所有设备

分为 UDP 广播端和 UDP 接收端,需要利用 setsocketopt 函数对当前 socket 管道进行设置

函数文档

#include <sys/socket.h>

int setsockopt(int sockfd, 
               int level, 
               int optname, const void *optval, socklen_t optlen);
  • 函数功能
    • 设置当前 socket 套接字相关的属性
  • 函数参数
    • sockfd:这是一个文件描述符,代表你要操作的套接字。在使用 socket() 函数创建套接字时会返回一个文件描述符,将其作为 sockfd 传入 setsockopt 函数,这样就能指定对哪个套接字进行选项设置。
    • level:指定了选项所在的协议层。常见的取值有:
      • SOL_SOCKET:表示通用的套接字选项,这些选项适用于所有类型的套接字,与具体的协议无关。
      • IPPROTO_TCP:用于设置 TCP 协议相关的选项。
      • IPPROTO_IP:用于设置 IP 协议相关的选项。
    • optname:具体要设置的选项名称。不同的 level 下有不同的 optname 取值。例如,当 level 为 SOL_SOCKET 时,optname 可以是:
      • SO_BROADCAST:允许套接字发送广播消息。
      • SO_REUSEADDR:允许在同一端口上多次绑定套接字,常用于服务器程序,方便在程序重启时能快速重新绑定到相同的地址和端口。
      • SO_RCVBUFSO_SNDBUF:分别用于设置接收缓冲区和发送缓冲区的大小。
    • optval:例如,对于 SO_BROADCAST 选项,optval 通常是一个整数,当值为 1 时表示允许广播,为 0 时表示禁止广播。
    • optlen:指定 optval 所指向缓冲区的长度,单位是字节。
1.2 UDP 广播

2. TCP 链接

TCP 协议特征

  • 面向链接
  • 数据传递可靠
  • 数据传递较慢
  • TCP 明确的区分【客户端 Client】和【服务器 Server】
  • 适合于下载软件,即时通讯。
2.1 TCP 三次握手

TCP 客户端和服务器建立连接的三次握手

2.2 TCP 四次挥手

TCP 客户端和服务器断开连接的【四次挥手】

2.3 TCP 链接相关函数
2.3.1 socket 函数

TCP 的 Socket 要求的参数和 UDP 不同,

函数文档

#include <sys/socket.h>
int socket(int family, int type, int protocol);
  • 和之前的 UDP 请求 Socket 函数一致,仅请求 type 类型不同
    • int type :
      • UDP SOCK_DGRAM
      • TCP SOCK_STREAM
2.3.2 bind 绑定函数

函数文档

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

操作和 UDP 一致

2.3.3 listen 函数

函数文档

#include <sys/socket.h>
int listen(int sockfd, int backlog);
  • 函数功能:
    • 【服务器端函数】设置【监听操作】,指定的 socket 文件描述符等待请求链接个数
  • 函数参数:
    • sockfd:由 socket() 函数返回的套接字描述符。
    • backlog:指定允许的最大等待连接队列长度。
  • 返回值
    • 成功返回 0,
    • 失败返回 -1
2.3.4 accept 函数

函数文档

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 函数功能:
    • 【服务器端函数】接受客户端请求,利用 struct sockaddr *addr 来存储客户端的 IP 地址信息
  • 函数参数:
    • int sockfd : Socket 对应的文件描述符
    • struct sockaddr *addr : 用于存储客户端 IP 地址数据的结构体指针
    • socklen_t *addrlen : 对应存储客户端 IP 地址数据结构体指针的 int 类型字节个数变量地址
  • 返回值:
    • 成功返回 ,新的套接字文件描述符,
    • 失败返回 -1
2.3.5 connect 函数

函数文档

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 函数功能:
    • 【客户端函数】请求链接服务器
  • 函数参数:
    • int sockfd : 当前客户端打开的 Socket 文件描述符,要求满足 TCP 协议要求
    • const struct sockaddr *addr : 请求链接的服务器 IP 地址信息
    • socklen_t addrlen : IP 地址信息字节个数
  • 返回值:
    • 成功返回 0
    • 失败返回 -1
2.3.6 send 函数

函数文档

#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • 函数功能:
    • 客户端/服务器发送数据函数
  • 函数参数:
    • int sockfd : 客户端链接服务器,或者服务器对应指定客户端的 Socket 文件描述符
    • const void *buf : 发送数据 buffer
    • size_t len : 发送的字节个数
    • int flags : 标志位
  • 返回值:
    -
    • 发送成功,返回发送数据的字节数
    • 失败返回 -1
2.3.6 recv 函数

函数文档

#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • 函数功能:
    • 客户端/服务器接收数据函数
  • 函数参数:
    • int sockfd : 客户端链接服务器,或者服务器对应指定客户端的 Socket 文件描述符
    • void *buf : 接收数据存储的 buffer 地址
    • size_t len : buffer 缓冲区字节数
    • int flags : 标志位
  • 返回值:
    • 接收成功,返回接收数据的字节数
    • 失败返回 -1