UDP协议:udp协议中文名称叫用户数据报协议
我们首先回忆一下大端和小端的问题:
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
网络字节序:我们知道内存存储数据多字节数据相对于内存地址来说有大端和小端之分,磁盘文件的多字节数据相对于文件中的偏移地址也有大端和小端之分,网络数据同样也有大端和小端之分,那么我们就应该用这些定义网络数据流的地址:
- 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
- 接收主机把从网络上接收到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序进行保存的
- 网络数据流的地址规定:先发出的数据是弟低地址,后发出的数据是高地址
- TCP/IP协议规定:网络数据流应采用大端字节序
- 不管主机是大端机还是小端机都要按照TCP/IP规定的网络字节序收发数据
- 如果发送机是小端机那么就要转化成大端字节序
UDP套接字调用connect(不同于TCP):没有三路握手过程,内核只是检查是否存在错误,记录对端IP地址和端口号。
下面介绍一下这些函数:
int socket(int domain, int type, int protocol);//创建socket文件描述符
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);//绑定端口号
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);//发送数据
几种网络协议的地址格式:
下面我们来看一下UDP服务器的代码实现:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*
* UDP网络聊天程序--服务器端
* 1. 创建socket--建立与网卡驱动的联系 socket
* 2. 为so