深入浅出ip地址!

前言:
在前面的文章里面,给大家举例了一些代码案例,但是代码里面的系统接口,并没有给大家做详细的说明,所有本篇文章会给大家做一个详细的说明!
一、先来看()接口:
通过前面的文章,我们现在知道了,在进行网络通信之前,我们会调用了()接口来做准备,具体做什么准备呢?那就是向系统申请系统资源,这样我们才可以进行网络编程:
int socket(int domain, int type , int protocol);
同时我们也知道是一个具有多功能的通信能力的,比如:
如果我不想要网络编程功能了,想进行本地的进程间通信,那该怎么做呢?那就是调用()接口的时候,替换掉传的参数即可 。
所以下面就来具体看一下接口传的参数含义了:
-PF_INET:IPv4互联网协议族-PF_INET6:IPv6互联网协议族-PF_LOCAL:本地通信的协议族-PF_PACKET:底层数据收发协议族-PF_IPX:Novell专用协议(互联网分组交换协议)
-1、SOCK_STREAM: 流式数据(TCP)-2、SOCK_UGRAM:报文式数据(UDP)
domain和type几乎可以唯一确定一种协议,因此,这个参数通常为0,这个0代表的domain和type指定后的默认协议
通过上面的详细介绍,大家现在应该对()这个接口非常熟悉了!
二、关于端口号和IP地址:

深入浅出ip地址!

文章插图
1、深入解析IP地址:
一般来说:
那我们怎样去提取网络标识呢?一般的做法是通过按位与的操作方式来提取网络标识,比如下面:
这里我们来深入理解一下子网掩码的作用?比如说现在:
假设:子网掩码是M.N.P.Q;则子网可用IP地址n=(256-M)(256-N)(256-P)*(256-Q)
例如现在IP地址为:211.99.34.33;掩码为:255.255.255.248;则可以使用的子网IP地址为8个IP地址,并且211.99.34.33所在的子网地址为211.99.34.32,广播地址为211.99.34.39:
这里稍微注意一下,211.99.34.33~211.99.34.38是我们可以用的哈!
下面我们来看一下一些特殊的IP地址:
然后是一些私有地址:不在公网使用,只在内网中使用:
2、地址数据类型解析:
为了讲清楚这个地址类型的知识点,我们先来看下面这副图:
深入浅出ip地址!

文章插图
看到这幅图,大家是不是明白了之前写的代码里面有很多接口老是有一个地址转换(把强制类型转换为 ):
int bind(int sock, struct sockaddr *addr , socklen_t addlen);
好了,这里因为我们是以IPV4为重点讲解,所以我们还是看这个结构体:
strcut sockaddr_in {sa_family_t sa_family;//具体的哪种地址类型,比如有IPV4地址类型,那么赋值的时候就是AF_INETu_int16_t sin_port;//指定端口号struct in_addr sin_addr;//指定具体的地址}
而结构体 具体为:
struct in_addr{u_int32_t s_addr;//这个具体的地址,是4字节的无符号整型数据类型}
那么这里就有一个问题,涉及到字符串地址"192.168.3.2"和整型IP地址的转换问题,这里的主要是通过函数转换来解决这个问题:
#include in_addr_t inet_addr(const char * strptr);//将IP字符转串转换为符合网络字节序的整数int inet_aton(const char* cp, struct in_addr*inp);//将IP字符串转换为符合网络字节序的整数,成功返回1,失败返回0char * inet_ntoa(struct in_addr in);//将符合网络字节序的整数地址转化为字符串形式