文章目录
- 1 套接字
- 1.1 什么是socket(译文:插座)
- 1.2特点
- 2字节序转换操作(S基本用来转端口号)
- 2.1大小端
- 2.2 网络序转主机序
- 2.3主机序转网络序
- 3IP地址转换操作
- 3.1点分十进制(stringIP)转换成网络序
-
- 3.2网络序转换点分十进制(sting IP)
-
- 4struct数据结构
- 4.1.sockaddr_in(IPV4专用)
- 4.2(IPV6专用)
- 4.3使用流程
- 5主机名转换操作
- 5.1主机名字和地址信息struct hostent
- 5.2 主机名转地址
- 5.3址转主机名
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返回值
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; unsigned short sin_port; struct in_addr sin_addr; unsigned char sin_zero[8];
};
struct in_addr {in_addr_t s_addr;
};
typedef unsigned int in_addr_t;
4.2(IPV6专用)
struct sockaddr_in6{uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr;
}
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结构指针 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!