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专用 |
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
};
struct in_addr {
in_addr_t s_addr;
};
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 |
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
私信
关注