1 套接字
1.1 什么是socket(译文:插座)
socket是一种特殊的文件描述符 可以使用linux文件IO操作函数来操作socket
socket是一个独立于具体协议的网络编程接口用来连接位于用一个主机或不同主机的进程,从而实现进程通信或网络通信: 网络通信本质也是不同主机进程之间通信,
socket是位于应用层和传输层之间一个抽象层。他把TCP/IP复杂的操作抽象为几个简单的接口,供应用层调用
1.2特点
一个文件描述符指向一个套接字(该套接字由内核借助两个缓冲区实现的)
socket成对出现
2字节序转换操作(S基本用来转端口号)
网络字节序
主机字节序
2.1大小端
小端法:高位存高地址 低位存低地址-》pc本地存储
大端法:低位存高地址 低位存高地址-》网络存储
2.2 网络序转主机序
No.
函数
含义
作用
1
ntohs()
network to host short
把unsigned short类型从网络序转换到主机序
2
ntohl()
network to host long
把unsigned long类型从网络序转换到主机序
2.3主机序转网络序
No.
函数
含义
作用
1
htons()
host to network short
把unsigned short类型从主机序转换到网络序
2
htonl()
host to network long
把unsigned long类型从主机序转换到网络序
3IP地址转换操作
192.168.1.11(string)–>atoi->>192.168.1.11(int)–>htonl–>192.168.1.11(网络序)
3.1点分十进制(stringIP)转换成网络序
3.1.1函数原型
int inet_pton(int af, const char *src, void *dst)
3.1.2参数
NO
参数
含义
1
af
地址族。AF_INET/AF_INET6
2
src
传入参数。点分十进制IP地址字符串
3
dst
传出参数。网络字节序长整型IP地址
3.1.3返回值
No.
返回值
含义
1
<0
失败
2
0
af和src格式不对
3
1
成功
3.2网络序转换点分十进制(sting IP)
3.2.1函数原型
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
3.2.2参数
NO
参数
含义
1
af
地址族。AF_INET/AF_INET6
2
src
传入参数。点分十进制IP地址字符串
3
dst
传出参数。网络字节序长整型IP地址
4
cnt
dst的大小
3.2.3返回值
No.
返回值
含义
1
NULL
失败
2
成功
dst
4struct数据结构
No.
结构体
功能
特性
用法
1
struct sockaddr
套接字地址结构
IPv4/IPv6通用
现在已经接近废弃
4.1.sockaddr_in(IPV4专用)
No.
结构体
功能
特性
1
struct sockaddr_in
IPv4套接字地址结构
IPv4专用
2
struct in_addr
IPv4地址结构
IPv4专用
3
in_addr_t
IPv4地址类型
IPv4专用IPv4套接字地址结构
struct sockaddr_in{
short sin_family; // 套接字地址簇类型,为AF_INET
unsigned short sin_port; // 端口号,网络字节序
struct in_addr sin_addr; // IP地址,网络字节序
unsigned char sin_zero[8];// 填充字节,用来保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 因为bind()中参数时struct sockaddr
};
IPv4地址结构
struct in_addr {
in_addr_t s_addr;
};
IPv4地址类型
typedef unsigned int in_addr_t;
4.2(IPV6专用)
struct sockaddr_in6{
uint8_t sin6_len; //IPv6 为固定的24 字节长度
sa_family_t sin6_family; //套接字地址簇类型,为AF_INET6
in_port_t sin6_port; //16 位端口号,网络字节序
uint32_t sin6_flowinfo; //32 位流标签
struct in6_addr sin6_addr; //128 位IP地址
}
4.3使用流程
5主机名转换操作
5.1主机名字和地址信息struct hostent
No.
参数
含义
1
h_name
主机名字
2
h_aliases
以空指针结尾的主机别名队列
3
h_addrtype
地址类型。AF_INET/AF_INET6
4
h_length
地址长度。在AF_INET类型地址中为4
5
h_addr
第一个IP地址
6
h_addr_list
以空指针结尾的IP地址的列表
5.2 主机名转地址
struct hostent *gethostbyname(const char *hostname)
参数
No.
参数
含义
1
hostname
主机名返回值
No.
返回值
含义
1
NULL
出错
2
非NULL
hostent结构指针
5.3址转主机名
struct hostent *gethostbyaddr(const char * addr, int len, int type)
参数
No.
参数
含义
1
addr
网络字节顺序地址
2
len
地址的长度。在AF_INET类型地址中为4
3
type
地址类型。AF_INET/AF_INET6返回值
No.
返回值
含义
1
NULL
出错
2
非NULL
hostent结构指针
。。
发布了42 篇原创文章 · 获赞 5 · 访问量 2967
私信
关注
标签:sockaddr,addr,AF,编程,struct,No,地址,IPv4,socket
来源: https://blog.csdn.net/weixin_45639955/article/details/104501821