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