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

文章目录

  • 1 套接字
    • 1.1 什么是socket(译文:插座)
    • 1.2特点
  • 2字节序转换操作(S基本用来转端口号)
    • 2.1大小端
    • 2.2 网络序转主机序
    • 2.3主机序转网络序
  • 3IP地址转换操作
    • 3.1点分十进制(stringIP)转换成网络序
      • 3.1.1函数原型
      • 3.1.2参数
      • 3.1.3返回值
    • 3.2网络序转换点分十进制(sting IP)
      • 3.2.1函数原型
      • 3.2.2参数
      • 3.2.3返回值
  • 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.函数含义作用
1ntohs()network to host short把unsigned short类型从网络序转换到主机序
2ntohl()network to host long把unsigned long类型从网络序转换到主机序

2.3主机序转网络序

No.函数含义作用
1htons()host to network short把unsigned short类型从主机序转换到网络序
2htonl()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参数含义
1af地址族。AF_INET/AF_INET6
2src传入参数。点分十进制IP地址字符串
3dst传出参数。网络字节序长整型IP地址

3.1.3返回值

No.返回值含义
1<0失败
20af和src格式不对
31成功

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参数含义
1af地址族。AF_INET/AF_INET6
2src传入参数。点分十进制IP地址字符串
3dst传出参数。网络字节序长整型IP地址
4cntdst的大小

3.2.3返回值

No.返回值含义
1NULL失败
2成功dst

4struct数据结构

No.结构体功能特性用法
1struct sockaddr套接字地址结构IPv4/IPv6通用现在已经接近废弃

在这里插入图片描述

4.1.sockaddr_in(IPV4专用)

No.结构体功能特性
1struct sockaddr_inIPv4套接字地址结构IPv4专用
2struct in_addrIPv4地址结构IPv4专用
3in_addr_tIPv4地址类型IPv4专用
  • IPv4套接字地址结构
struct sockaddr_in{short sin_family;         // 套接字地址簇类型,为AF_INETunsigned 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_INET6in_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.参数含义
1h_name主机名字
2h_aliases以空指针结尾的主机别名队列
3h_addrtype地址类型。AF_INET/AF_INET6
4h_length地址长度。在AF_INET类型地址中为4
5h_addr第一个IP地址
6h_addr_list以空指针结尾的IP地址的列表

5.2 主机名转地址

struct hostent *gethostbyname(const char *hostname)
  • 参数
No.参数含义
1hostname主机名
  • 返回值
No.返回值含义
1NULL出错
2非NULLhostent结构指针

5.3址转主机名

struct hostent *gethostbyaddr(const char * addr, int len, int type)
  • 参数
No.参数含义
1addr网络字节顺序地址
2len地址的长度。在AF_INET类型地址中为4
3type地址类型。AF_INET/AF_INET6
  • 返回值
No.返回值含义
1NULL出错
2非NULLhostent结构指针


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部