字节序
1、概述
什么是字节序:
字节序就是字节的存储顺序,分为大端字节序和小端字节序。
- 大端字节序:低地址存高位(网络)
- 小端字节序:低地址存低位(主机)
检验主机字节序模式:
#include <stdio.h>
int main(){
unsigned int a = 0x11223344;
unsigned char b = *((unsigned char *)&a);
if(b == 0x44){
printf("小端字节序\n");
}else{
printf("大端字节序\n");
}
return 0;
}
2、字节序转换
2.1 端口号字节序转换函数
因为主机使用的是小端字节序,网络使用的是大端字节序,因此在数据传输时,需要先将数据转换为大端字节序传给网络,之后再将数据转换为小端字节序传给另一个主机。
/* h:本机 n:网络 l:32位 s:16位 */
//32位数据(4字节)
uint32_t htonl(uint32_t hostlong);//本机->网络
uint32_t ntohl(uint32_t netlong);//网络->本机
//16位数据(2字节)
uint16_t htons(uint16_t hostshort);//本机->网络
uint16_t ntohs(uint16_t netshort);//网络->本机
返回值:将小端字节序转换为大端字节序后的端口号
参数:端口号值
2.2 IP地址字节序转换函数
该函数主要是实现点分十进制表示的IP地址转换,而不需要一个字节一个字节的去转换。
2.2.1 IPv4
//点分十进制字符串->网络字节序
in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);
//网络字节序->点分十进制字符串
char *inet_ntoa(struct in_addr in);
inet_addr返回值:ip地址
cp:点分十进制字符串,例如传入"192.168.1.1"这个字符串
inp:ip地址
inet_ntoa返回值:点分十进制字符串
in:ip地址
2.2.1 IPv6
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
套接字socket
概述
socket多种含义:
- 应用编程接口API:socket API,简称socket。
- 函数名:socket API中有一个名为socket的函数
- 端点:比如TCP连接是有两个端点,这两个端点是一对一通信的关系。这个端点也叫socket
- 文件描述符:socket函数的返回值是一个socket描述符,简称socket
socket的作用:
socket处在应用层与内核之间。在应用层中实现的是与应用相关的代码,在内核中实现的是网络通信相关的代码。在OSI结构中,应用层就是OSI的应用层、表示层、会话层,内核就是运输层、网络层、数据链路层、物理层。
什么是三元组:
三元组指的是IP地址、端口号、协议。该数据通过bind函数进行绑定。
- IP地址:标识计算机,找到与网络中的哪一个计算机进行通信。
- 端口号:标识进程,找到与计算机中哪一个进程进行通信。
- 协议:指定数据以什么样的方式进行传递。主要指TCP、UDP
套接字的类型:
- 流式套接字 (SOCK_STREAM) :提供可靠的、面向连接的通信流;它使用TCP,从而保证数据传输的可靠性和顺序性
- 数据报套接字 (SOCK_DGRAM) :定义了一种不可靠、面向无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP
- 原始套接字(SOCK_RAW) :允许直接访问底层协议,如IP或ICMP,它功能强大但使用较为不便,主要用于协议开发。
socket文件的读写含义:
socket在Linux中也是一种文件,对socket文件进行读就是读取网络传输过来的数据,对socket文件进行写就是向网络中传输相应的数据。
相关函数
socket相关API:
创建套接字、绑定通信结构体、监听套接字、接收套接字、发起连接
通用
1、创建套接字
int socket(int domain, int type, int protocol);
返回值:成功返回socket文件描述符,失败返回-1
domain:指定bind中传入的地址族结构体的类型,与sa_family_t的取值要一致。
domain值 | 含义 |
AF_UNIX | UNIX 域套接字地址族,用于在同一台主机上的进程间通信 |
AF_INET | IPv4 地址族,用于 IPv4 通信 |
AF_INET6 | IPv6 地址族,用于 IPv6 通信 |
type:套接字的类型,就是"概述"中的说的三种类型
type值 | 使用的协议 |