- 网络通信中的数据必须带有:源端IP,源端端口,目的端IP,目的端端口,协议。
- 套接字编程头文件
#include <netinet/in.h> // struct_sockaddr_in结构体的定义以及协议的宏 #include <arpa/inet.h> // 字节序转换接口 #include <sys/socket.h> // 套接字接口
1、UDP
- UDP流程图
1.1常用接口
1、创建套接字
- int socket(int domain, int type, int protocol);
- domain:地址域->确定本次socket通信使用哪种协议版本的地址结构,不同的协议版本有不同的地址结构->AF_INET IPV4网络协议
- type:套接字类型(流式套接字->SOCK_STREAM/数据报套接字->SOCK_DGRAM)
- protocol:协议类型(通常就是传输层协议IPPROTO_TCP / IPPROTO_UDP),默认为0->流式默认tcp/数据默认udp
- 返回值:文件描述符->非负整数->套接字所有其他接口的操作句柄;失败返回-1
2、为套接字绑定地址信息
- int bind(int sockfd, struct sockaddr* addr, socklen_t len);
- sockfd:创建套接字返回的操作句柄
- addr:要绑定的地址信息,用于描述内核中socket所使用的地址信息
- len:要绑定的地址信息长度, bind接口是统一的地址绑定接口, 但是地址结构多种多样长度不一
- 返回值:成功返回0,失败返回-1
- 注意 : 一般用户端不主动去绑定本机的信息, 因为地址会自动绑定合适的, 而自己绑定可能会造成端口冲突
3、接收数据->不仅仅是接收数据,还要通过接收得知这个数据是谁发的,以便进行回复
- ssize_t recvfrom(int sockfd, char* buf, int len, int fiag, struct sockaddr* peer_addr, socklen_t* addrlen);
- sockfd:socket操作句柄
- buf:一块缓冲区,用于接收从接收缓冲区中取出的数据;
- len:想要接收的数据长度
- flag:操作选项标志,默认为0,表示阻塞操作
- peer_addr:发送方的地址信息
- addrlen:想要获取的地址信息长度以及返回实际长度
- 返回值:成果返回实际接收到的数据字节长度,失败返回-1
4、发送数据
- ssize_t sendto(int sockfd, char* data, int len, int flag, struct sockaddr* peer_addr, socklen_t addrlen);
- sockfd:socket操作句柄
- data:要发送的数据首地址
- len:要发送数据长度
- flag:默认为0,表示阻塞操作
- peer_addr:接收方的地址信息
- addrlen:地址信息长度
- 返回值:成功返回实际发送数据的字节长度,失败返回-1
5、关闭套接字
- int clsoe(int fd);