
UDP广播和 TCP 协议
AI-摘要
Tianli GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
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_RCVBUF
和SO_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 :
发送数据 buffersize_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
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载必须注明来自 卡卡罗特
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果