Tcp/Ip协议理解_2

Linux网络编程基础API

  • socket地址API(port ip
  • socket基础API  ( 创建 命名 监听socket 接受链接 发起连接 读写数据 获取地址信息 检测带外标记 设置socket选项
  • 网络信息API    (主机和IP地址之间的转换  服务名称和端口号之间的转换 netdb.h

1.socket地址API

  •   大端:高位字节在内存的低地址处 (网络
  •         小段:低位字节(0~7) 在内存的高地址处 ( 主机
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong); //转换IP
unsigned short int htons(unsigned short int hostshort); //转换port
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

2.通用socket地址(

#include<bits/socket.h>
struct sockaddr
{
sa_family_t sa_family; //地址族 AF_INET AF_UNIX AF_INET6  对应协议族(domain PF_INET PF_UNIX 。。。
char sa_data[14];  //存放socket地址值 
}

3.专用socket地址

  • linux为各个协议族提供专门的socket地址结构体
  • UNIX本地协议族
  • #include<sys/un.h>
    struct sockaddr_un
    {
    sa_family_t sin_family;/*地址族:AF_UNIX*/
    char sun_path[108];/*文件路径名*/
    };

4.TCP/IP协议族

  • IPv4 
struct sockaddr_in
{
sa_family_t sin_family;/*地址族:AF_INET*/
u_int16_t sin_port;/*端口号,要用网络字节序表示*/
struct in_addr sin_addr;/*IPv4地址结构体,见下面*/
};
struct in_addr
{
u_int32_t s_addr;/*IPv4地址,要用网络字节序表示*/
};
struct sockaddr_in6
{
sa_family_t sin6_family;/*地址族:AF_INET6*/
u_int16_t sin6_port;/*端口号,要用网络字节序表示*/
u_int32_t sin6_flowinfo;/*流信息,应设置为0*/
struct in6_addr sin6_addr;/*IPv6地址结构体,见下面*/
u_int32_t sin6_scope_id;/*scope ID,尚处于实验阶段*/
};
struct in6_addr
{
unsigned char sa_addr[16];/*IPv6地址,要用网络字节序表示*/
};

5.IP地址转换函数

我们通常使用点分十进制字符串表示IPv4地址  但编程中需要把他们转换为二进制整数 方便使用 

#include<arpa/inet.h>
in_addr_t inet_addr(const char*strptr);
int inet_aton(const char*cp,struct in_addr*inp);
char*inet_ntoa(struct in_addr in);

inet_addr 函数用点分十进制字符串表示的IPv4地址 转化为网络字节序整数表示的IPv4地址

inet_aton 函数同上 将结果存储于inp指向的地址结构体  成功返回1 失败0

inet_ntoa 将网络字节序表示的IPv4转换为 点分十进制

#include<arpa/inet.h>
int inet_pton(int af,const char*src,void*dst);
const char*inet_ntop(int af,const void*src,char*dst,socklen_t
cnt);

inet_pton 与上面得函数功能相同  af  AF_INET 等

inet_ntop 相反 cnt 指定目标存储单元大小

可以通过宏指定

#include<netinet/in.h>
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46

 

  

posted @ 2018-11-21 19:29  Lumi_Imp  阅读(256)  评论(0编辑  收藏  举报