公司网站建设哪里好,外包手工活在哪里拿货,网站怎么弄实名制认证,后期网站目录
1--IP地址和端口号
2--地址信息的表示
3--网络字节序与地址变换
4--网络地址的初始化与分配
5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类#xff1a; ① IPv4 表示 4 字节地址族#xff1b; ② IPv6 表示 16 字节地址族#xff1b; IPv4 标准的 4 …目录
1--IP地址和端口号
2--地址信息的表示
3--网络字节序与地址变换
4--网络地址的初始化与分配
5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类 ① IPv4 表示 4 字节地址族 ② IPv6 表示 16 字节地址族 IPv4 标准的 4 字节 IP 地址分为网络地址和主机地址一般分为 A、B、C、D和 E 类型 ① A类网络ID1字节主机ID3字节首字节范围0~127 ② B类网络ID2字节主机ID2字节首字节范围128~191 ③ C类网络ID3字节主机ID1字节首字节范围192~223 ④ D类网络ID4字节 ⑤ E类已被预约 端口号 端口号用于区分 Socket不同的应用程序不能将 1 个端口号分配给不同的 Socket 端口号由 16 位构成可分配的端口号范围是 0-65535其中 0-1023 是知名端口用于分配给特定的应用程序 TCP Socket 和 UDP Socket 不会共用端口号因此允许重复 2--地址信息的表示
表示 IPv4 地址的结构体 sockaddr_in
struct sockaddr_in{sa_family_t sin_family; // 地址族uint16_t sin_port; // 16位 TCP/UDP 端口号struct in_addr sin_addr; // 32位IP地址char sin_zero[8]; // 不使用
} 成员 sin_family表示地址族常用的地址族如下 ① AF_INET 表示 IPv4 网络协议中使用的地址族 ② AF_INET6 表示 IPv6 网络协议中使用的地址族 ③ AF_LOCAL 表示本地通信中采用的 UNIX 的地址族 // 一般用法
SOCKADDR_IN servAddr;
servAddr.sin_family AF_INET; bind() 函数第二个参数期望获得 sockaddr 结构体类型其定义如下 struct sockaddr{sa_family_t sin_family; // 地址族char sa_data[14]; // 地址信息包含IP地址和端口号其它部分填充为0
} 一般需要将 sockadd_in 结构体强制转换为 sockaddr 结构体变量将输入到 bind() 函数中 bind(serv_sock, (struct sockaddr*) serv_addr, sizeof(serv_addr)); 其中 serv_addr 是sockadd_in结构体变量 3--网络字节序与地址变换 CPU向内存保存数据的方式有两种 ① 大端序高位字节存放到低位地址 ② 小端序高位字节存放到高位地址 在通过网络传输数据时约定采用统一的网络字节序方式即统一为大端序先把数据数组转化成网络字节序大端序再进行传输接收方收到数据后将网络字节序解析为符合自己CPU的数据方式 // 字节序转换
unsigned short htons(unsigned short); // 主机字节序转换为网络字节序
unsigned short ntohs(unsigned short); // 网络字节序转换为主机字节序
unsigned long htonl(unsigned short); // 主机字节序转换为网络字节序
unsigned long ntohl(unsigned short); // 网络字节序转换为主机字节序 h 表示主机host字节序n 表示网络network字节序s 表示 shortlinux 中 short 类型占用 2 字节l 表示 longlinux 中 long 类型占用 4 字节 4--网络地址的初始化与分配 inet_addr() 函数会将字符串形式的 IP 地址转换为 32 位整数型数据并在转换类型的同时完成网络字节序的转换 inet_addr() 函数还可以检测无效的 IP 地址 // inet_addr.c
// gcc inet_addr.c -o inet_addr
// ./inet_addr#include stdio.h
#include arpa/inet.hint main(int argc, char *argv[]){char *arrd1 1.2.3.4; char *arrd2 1.2.3.256;unsigned long conv_addr inet_addr(arrd1);if(conv_addr INADDR_NONE){printf(Error occured \n);}else{printf(Network ordered integer addr: %#lx \n, conv_addr);}conv_addr inet_addr(arrd2);if(conv_addr INADDR_NONE){printf(Error occured \n);}else{printf(Network ordered integer addr: %#lx \n, conv_addr);}return 0;
} inet_aton() 函数的功能与 inet_addr() 相同但其在调用过程中会将转换后的 IP 地址信息代入到 sockaddr_in 结构体中因此使用频率更高 // inet_aton.c
// gcc inet_aton.c -o inet_aton
// ./inet_aton#include stdio.h
#include stdlib.h
#include arpa/inet.hvoid error_handling(char *message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){char *addr 127.232.124.79;struct sockaddr_in addr_inet;if(!inet_aton(addr, addr_inet.sin_addr)){error_handling(Conversion error);}else{printf(Network ordered integer addr: %#x \n, addr_inet.sin_addr.s_addr);}return 0;
}inet_ntoa() 函数与上述两个函数的功能相反其将网络字节序整数型 IP 地址转换为字符串形式 调用 inet_ntoa() 函数后需要存储对应的字符串信息否则下次被调用会被覆盖 // 网络地址的初始化
struct sockaddr_in addr;
char* serv_ip 211.217.168.13; // 声明 IP 地址字符串
char* serv_port 9190; // 声明端口号字符串
memset(addr, 0, sizeof(addr)); // 结构体变量 addr 的所有成员初始化为 0
addr.sin_family AF_INET; // 指定地址族
addr.sin_addr.s_addr inet_addr(serv_ip); // 基于字符串的 IP 地址初始化
addr.sin_port htons(atoi(serv_port)); // 基于字符串的端口号初始化
5--Windows部分代码案例
// gcc endian_conv_win.c -o endian_conv_win -lwsock32
// endian_conv_win#include stdio.h
#include winsock.hvoid ErrorHandling(char* message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){WSADATA wsaData;unsigned short host_port 0x1234;unsigned short net_port;unsigned long host_addr 0x12345678;unsigned long net_addr;if(WSAStartup(MAKEWORD(2, 2), wsaData) ! 0){ErrorHandling(WSAStartup() error!);}net_port htons(host_port);net_addr htonl(host_addr);printf(Host ordered port: %#x \n, host_port);printf(Network ordered port: %#x \n, net_port);printf(Host ordered address: %#lx \n, host_addr);printf(Network ordered address: %#lx \n, net_addr);WSACleanup();return 0;
} // gcc inet_adrconv_win.c -o inet_adrconv_win -lwsock32
// inet_adrconv_win#include stdio.h
#include string.h
#include winsock2.hvoid ErrorHandling(char* message){fputs(message, stderr);fputc(\n, stderr);exit(1);
}int main(int argc, char *argv[]){WSADATA wsaData;if(WSAStartup(MAKEWORD(2, 2), wsaData) ! 0){ErrorHandling(WSAStartup() error!);}// inet_addr 函数调用示例{char *addr 127.212.124.78;unsigned long conv_addr inet_addr(addr);if(conv_addr INADDR_NONE){printf(Error occured! \n);}else{printf(Network ordered integer addr: %xlx \n, conv_addr);}}// inet_ntoa 函数调用示例{struct sockaddr_in addr;char *strPtr;char strArr[20];addr.sin_addr.s_addr htonl(0x1020304);strPtr inet_ntoa(addr.sin_addr);strcpy(strArr, strPtr);printf(Dotted-Decimal notation3 %s \n, strArr);}WSACleanup();return 0;}