问题
网络编程接口中一些参数的意义是什么?
socket 参数详解
socket() 中的 domain 参数 (协议族)
socket() 中的 type 和 protocal 参数
type:用于指定协议类型
- SOCK_STREAM:流式数据 (TCP)
- SOCK_DGRAM:报文式数据 (UDP)
protocal:用于指定协议族中符合类型的具体协议
- domain 和 type 几乎可以唯一确定一种协议,因此,这个参数通常为0
- 即:0代表 domain 和 type 指定后的默认协议
关于 端口号 和 IP地址
端口号是一个2字节数据
0 - 1023 作为特定端口被预定义 (分配给特定应用程序)
IP 地址是一个4字节地址族 (可分为5类地址)
深入解析 IP 地址
IP 地址分为 网络标识 和 主机标识 两部分
网络标识:标识网络主机 (设备) 所在的网络
主机地址:标识网络主机 (设备) 的具体地址
通过子网掩码来区分网络标识和主机标识。
IP 地址 和 子网掩码 配合使用区分 网络标识 和 主机标识
子网掩码的表示形式也是一个4字节的整型数
子网掩码用于从 IP 地址中提取 网络标识
深入解析子网掩码
子网地址:192.168.3.0
广播地址:192.168.3.255
可用地址:256 - 2 = 254
简洁表示法:192.168.3.44 / 24
特殊的地址
- 0.0.0.0 / 0 - 保留,常用于代表 "缺省网络"
- 127.0.0.0 / 8 - 回环地址,常用于本地软件回送测试
- 255.255.255.255 / 32 - 广播地址
私有地址:不在公网使用,只在内网使用
- A. 10.0.0.0 - 10.255.255.255 / 8
- B. 172.16.0.0 - 172.31.255.255 / 16
- C. 192.168.0.0 - 192.168.255.255 / 24
网络编程中的地址类型
地址数据类型解析
IP 地址相关函数
代码示例
地址函数实验
#include <stdio.h>
#include <malloc.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
unsigned int addr = inet_addr("1.2.3.4");
struct in_addr addr1 = {0x09080706};
struct in_addr addr2 = {0x05040302};
char* s1 = strcpy(malloc(30), inet_ntoa(addr1));
char* s2 = strcpy(malloc(30), inet_ntoa(addr2));
printf("addr = %x\n", addr);
printf("addr1 = %s\n", s1);
printf("addr2 = %s\n", s2);
if(inet_aton("D.T.Software", &addr1))
{
printf("addr1 = %x\n", addr1.s_addr);
}
free(s1);
free(s2);
return 0;
}
inet_addr 函数无法得知 IP 地址字符串是否合法,而 inet_aton 函数可以判断目标 IP 地址字符串是否合法。
inet_ntoa 函数的返回值是存储在静态存储区的,第二次调用此函数时,由于返回值使用的是同一片空间,所以第一次通过此函数返回的字符串就和第二次返回的字符串相同,解决此问题的方案:将返回的字符串拷贝到堆空间。
程序运行结果如下所示:
由于本机的存储方式为小端存储,而这些地址函数的结果会转换为大端存储,所以显示的结果会和我们所定义的相反。