linux网络编程--socket编程(基本概念,转换操作,sockaddr)

1 套接字

1.1 什么是socket(译文:插座)

  • socket是一种特殊的文件描述符 可以使用linux文件IO操作函数来操作socket
  • socket是一个独立于具体协议的网络编程接口用来连接位于用一个主机或不同主机的进程,从而实现进程通信或网络通信: 网络通信本质也是不同主机进程之间通信,
  • socket是位于应用层和传输层之间一个抽象层。他把TCP/IP复杂的操作抽象为几个简单的接口,供应用层调用

1.2特点

  • 一个文件描述符指向一个套接字(该套接字由内核借助两个缓冲区实现的)
  • socket成对出现
    linux网络编程--socket编程(基本概念,转换操作,sockaddr)

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通用 现在已经接近废弃

linux网络编程--socket编程(基本概念,转换操作,sockaddr)

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使用流程

linux网络编程--socket编程(基本概念,转换操作,sockaddr)

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结构指针
linux网络编程--socket编程(基本概念,转换操作,sockaddr)linux网络编程--socket编程(基本概念,转换操作,sockaddr) 。。 发布了42 篇原创文章 · 获赞 5 · 访问量 2967 私信 关注
上一篇:CSS笔记day1


下一篇:Linux 13网络服务器与客户端ser,cli