【Linux】socket套接字接口(UDP)

UDP:用户数据包协议,特性是 无连接,不可靠,面向数据包;
应用场景:数据的实时性要求高于安全性的通信场景。例如:视频传输
socket套接字编程
套接字编程主要是: TCP通信程序和UDP通信程序的编写
应用程序是程序员开发的,应用协议是程序员自己定的,但是从传输层开始往下都是操作系统实现的。网络编程通常也叫做套接字编程,套接字实际上就是一套网络通信编程的接口,程序员可以通过这套接口,并且提供各种信息之后就可以实现传输层以下基层的操作。
套接字 = IP + PORT
UDP通信流程:
客户端:通信主机中主动发出请求的一端。
客户端给服务端发送请求首先需要知道服务端的地址信息。
服务端: 通信主机中被动接收请求的一端。
提前告诉客户端自己的地址信息是什么,意味着服务端的地址信息通常不能随意更改。
通信流程:

  1. 创建套接字:在内核中创建一个socket结构体,返回一个文件描述符作为操作句柄。
    用于使进程和网卡之间建立联系。
  2. 为套接字绑定地址信息:在内核的socket结构体中添加地址信息,告诉操作系统自己使用
    哪个地址和端口,则收到发往这个地址和端口的数据之后,放入这个socket的接收缓冲区中。
  3. 发送数据:将数据拷贝到内核中的socket发送缓冲区中(操作系统会取出数据进行层层封装
    然后发送出去)
  4. 接收数据:进程通过操作句柄从内核的socket接收缓冲区中取出已经接收的数据
    (操作系统已经完成了传输层以下的数据分用)
  5. 关闭套接字:释放资源
    注:
    服务端绑定的是服务端主机的 IP地址和端口号 即只能绑定自己主机上的IP地址。
    客户端绑定的是客户端主机的IP地址和端口。
    一个数据中包含:源IP地址,目的IP地址,源端口,目的端口,协议。
    客户端发送消息时需要提前知道服务端的地址。
    socket通信接口介绍:

```c
//1.创建套接字接口
int socket(int domain, int type, int protocol);
domain: 地址域,标识是什么样的地址信息结构    AF_INET 是ipv4的地地址结构
type: 套接字类型,决定了提供什么样的传输服务
    SOCK_STREAM:流式套接字(tcp) / SOCK_DGRAM:数据包套接字(udp)
protocol: 协议类型,决定是什么样的网络通信协议
    0:套接字默认的通信协议
    IPPROTO_TCP: tcp协议      IPPROTO_UDP:udp协议
返回值: 返回一个文件描述符作为操作句柄;失败返回-1   

//2.为套接字绑定地址信息
int bind(int sockfd, struct socketaddr* addr, socklen_t len);
sockfd: 套接字操作句柄
addr: 地址信息结构首地址,用于描述内核中socket中所使用的地址信息
len: 地址信息结构长度
bind接口是统一地址绑定接口,但是地址结构却是多种多样,长度不一。

//3.发送数据
ssize_t sendto(int sockfd, char* data, int data_len, int flag, 
        struct socketaddr* dest_addr, socklen_t addr_len);
sockfd: 指定内核中的socket结构体
data: 要发送的数据首地址
data_len: 要发送的数据长度
flag: 选项参数,默认为0,表示阻塞发送(若发送缓冲区中数据已经满了,则需要等待)
dest_addr: 目的端的地址信息首地址,告诉socket这个数据要发送给谁
addr_len: 地址信息长度
返回值:成功返回实际发送的数据字节长度;失败返回-1  

//4.接收数据
int recvfrom(int sockfd, char* buf, int buf_len, int flag,
            struct sockaddr* peer_addr, socklen_t* addr_len);
sockfd: 指定内核中的socket结构体,从哪个socket的接收缓冲区取出数据
buf: 用户态缓冲区,用于存放从内核拷贝出来的数据
buflen: 想要获取的数据的长度,这个长度不能大于buf的长度
flag: 选项参数,默认为0,阻塞接收,缓冲区中没有数据则阻塞等待
peer_addr: 源端的地址缓冲区首地址,告诉我们这个数据是谁发的
addr_len: 输入输出型参数,用于指定想要获取多长的地址信息,并且用于返回实际获取的地址长度
返回值:成功返回实际接收到的数据长度;失败返回-1.  

//5.关闭套接字
int close(int fd);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值