基于UDP协议——————服务器

本文介绍了UDP协议的基本概念,包括其无连接、不可靠传输和面向数据报的特性,并详细讲解了网络字节序,特别是大端字节序在网络传输中的作用。接着,文章列举了UDP服务器的常见API,如socket、bind、htons等,并概述了服务器和客户端的建立过程。最后,提到了一个简单的UDP服务器实现,包含client和server的源文件。
摘要由CSDN通过智能技术生成

UDP协议概念

UDP协议是在整个网络分层的传输层的协议,具有以下特性
1.无连接
2.不可靠传输
3.面向数据报
关于特性这里不做过多阐述

网络字节序

首先网络数据流采用大端字节序,即低地址高字节。
网络中先发出去的数据是低地址,后发出去的数据是高地址
在这里插入图片描述
而为什么是大端字节序存储呢?
原因如下:
我们都知道,网络是分层的,数据在各个层面进行传输时是需要添加报头的。而报头是添加在数据之后的,所以是存储在低地址处。

在这里插入图片描述

由于网络中先发出去的是低地址的数据,等同于先发出去的数据是报头,后发出去的是真正的数据,而接收方是先接收报头,再接收数据,先接收报头并解析,可以通过报头得到数据的属性,进而针对性的接收数据。这样做可以节省时间,提高数据在网络层面中的传输效率。

 #include <arpa/inet.h> 
  uint32_t htonl(uint32_t hostlong);   
  uint16_t htons(uint16_t hostshort);   
  uint32_t ntohl(uint32_t netlong);   
  uint16_t ntohs(uint16_t netshort); 

h:表示主机,n表示网络 ,l代表32位长整数,s表示16位短整数
htons 16位短整数主机字节序转网络字节序

UDP服务器的常见API

/创建 socket 文件描述符(客户端+服务端)

int socket(int domain, int type, int protocol);

damain:IPV4通信,AF_INET
type:类型,SOCK_DGRAM
protocol:选择0即可
返回值:成功返回一个文件描述符,失败返回-1

绑定端口号 ( 服务器)

int bind(int socket, const struct sockaddr *address,socklen_t address_len);

socket:socket得到的文件描述符
address:struct sockaddr *的一个结构体,一般需要从struct sockaddr_in 结构体强转而来
address_len:address结构体的大小
返回值:成功返回0,失败返回-1

struct sockaddr_in 结构体
在这里插入图片描述
里面有三个成员,分别是
sin_family,协议家族
sin_port 端口号
sin_addr,网络地址(IP) 是一个结构体,里面的成员只有一个,为s_addr
在这里插入图片描述

在bind的时候需要先对struct sockaddr_in结构体进行初始化
sin_family: AF_INET
sin_port:端口号,需要通过主机转网络函数进行转换 htonshtonl
sin_addr.s_addr: IP,需要通过inet_addr函数进行转换

in_addr_t inet_addr(const char *cp);

接收消息(客户端+服务端)

ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
              int flags, struct sockaddr *restrict address,
              socklen_t *restrict address_len);
              
socket:文件描述符
buffer:写到哪(存放数据的位置)
length:希望读取的长度
flag:设为0即可
address:结构体,详见bind
len:结构体的大小
返回值:实际读取的长度

发送数据(客户端+服务端)

ssize_t sendto(int socket, const void *message, size_t length,
              int flags, const struct sockaddr *dest_addr,
              socklen_t dest_len);
              
socket:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值