深入浅出IP地址
问题:
网络编程接口中一些参数的意义是什么?
socke = socket(PF_INET, SOCK_STREAM, 0);
socket参数详解
int socket(int domain, int type, int protocol);
参数 | 意义 |
---|---|
domain | 套接字中使用的协议族信息 |
type | 套接字数据传输类型信息 |
protocol | 设备间通信使用的协议信息 |
socket()中domain参数(协议族)
-
PF_INET
:IPv4互联网协议族 -
PF_INET6
:IPv6互联网协议族 -
PF_PACKET
:底层数据收发协议族->进程间通信 -
PF_IPX
:Novell专用协议(互联网分组交换协议)专用网通信 - …
注意:
不同协议中的地址表现形式可能不同,网络编程时地址类型必须和协议类型匹配。
socke()中type和protocol参数
- type:用于指定协议类型
- SOCK_STREAM:流式数据(TCP)
- SOCK_UGRAM:报文式数据(UDP)
- protocol:用于指定协议族中符合类型的具体协议
- domain和type几乎可以唯一确定一种协议,因此,这个参数通常是0
- 即:0代表domain和type指定后的默认协议
关于端口号和IP地址
- 端口号是一个2字节数据
- 0-1023作为特定端口被预定义(分配给指定应用程序)
- IP地址是一个4字节地址族(可分为5类地址)
深入解析IP地址
- IP地址分为网络标识和主机标识
- 网络标识:标识网络主机(设备)所在的网络
- 主机标识:标识网络主机(设备)的具体地址
- IP地址和子网掩码配合使用,区分网络标识和主机标识
- 子网掩码的表现形式也是一个4字节的整型号=数
- 子网掩码用于从IP地址中提取网络标识
- 深入理解子网掩码
- 特殊的地址
- 0.0.0.0/0-保留,常用于代表“缺省网络”
- 127.0.0.0/8-回环地址,常用于本地软件回送测试
- 255.255.255.255/32-广播地址
- 私有地址:不在公网使用,只在内网使用
- 10.0.0.0-10.255.255.255/8
- 172.16.0.0.-172.31.255.255/16
- 192.168.0.0-192.168.255.255/24
网络编程中的地址类型
- IP地址相关函数
#include<arpa/inet.h>
函数原型 | 功能描述 |
---|---|
in_addr_t inet_addr(const char* strptr); | 将IP字符串转换为符合网络字节序的整数 |
int inet_aton(const char* cp, strcut in_addr* inp); | 将IP字符串转换为符合网络字节序的整数,成功返回1,失败返回0 |
char* inet_ntoa(struct in_addr_in); | 将符合网络字节序的整数地址转换为字符串形式 |
示例代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <malloc.h>
int main(void)
{
unsigned int addr = inet_addr("1.2.3.4");
struct in_addr addr1 = {0x09080706};
struct in_addr addr2 = {0x05040302};
//inet_ntoa,每次将转换的结果放在同一空间中,将此空间作为字符串的起始地址返回,所以需进行字符串copy
char* s1 = strcpy(malloc(32),inet_ntoa(addr1));
char* s2 = strcpy(malloc(32),inet_ntoa(addr2));
printf("addr = %x\n",addr);
if(inet_aton("1.2.3.1",&addr1)) //还可以判读IP地址是否合法
{
printf("addr1 = %x\n",addr1.s_addr);
}
printf("addr1 = %x\n",addr1.s_addr);
printf("addr2 = %x\n",addr2.s_addr);
printf("s1 = %s\n",s1);
printf("s2 = %s\n",s2);
free(s1);
free(s2);
return 0;
}