第一章 网络编程基础

本文介绍了网络编程的基本概念,包括进程间通信、联网协议和分层思想。详细讲解了OSI模型的七层结构和TCP/IP协议栈,特别是网络层和传输层的功能。还深入讨论了IP地址的分类、子网掩码的作用以及字节序在跨主机传输中的重要性。
摘要由CSDN通过智能技术生成

目录

网络编程的概念

联网协议和层

网络采用分层的思想

分层的好处:

OSI体系结构(重点)

TCP/IP协议介绍

网络接口与物理层 

 网络层

传输层

TCP和UDP的异同点:(重点)

IP地址

IP地址的分类

IP地址划分

点分十进制

子网掩码(重难点)

1.子网掩码

2.默认子网掩码

3.子网掩码的使用

网关 

域名系统 

端口号

跨主机传输

字节序

 本地字节序与网络字节序

字节序转换函数

1.htons htonl         其功能是将主机字节序转换为网络字节序

结构体对齐

类型长度

IP转换

2. 网络字节序--->点分十进制


网络编程的概念

 1. 进程间通信:由于进程与进程之间的用户空间相互独立,内核空间所有进程共享,若要让进程之间实现通信,需要引入进程间通信机制。利用内核空间进行通信。
 2. 网络编程就是进程间通信,只不过多个进程间不一定在同一台主机上。
 3.  由于不在同一个主机上,不在同一个主机上就需要注意协议。

联网协议和层

联网协议:定义一组如何在网络上传输信息的规则

网络采用分层的思想

每一层都有自己的独立功能,但是每一次都不可获取;通常把功能相近的协议们组织在一起,放到一层中(即协议栈),因此每一层都有多个协议。

分层的好处:
  1. 各层次之间相互独立,每层之间都有相应的接口,每层只需要通过层间的接口链接上下层完成相应接口的服务即可,不需要知道上下层如何实现的。
  2. 若任意一层发生变化只要层间接口关系保持不变,则该层的上下层均不受影响,层间稳定。
  3. 若整个的系统被分解为若干个相对独立的子系统即分层思想,在进行调试和维护时,可以对每一层进行单独的调试,并不因为某一层的缘故从而导致整个系统瘫痪。
  4. 易于实现和维护(知道每一层的功能,可以去指定层查找)。
  5. 能够促进标准化工作。

OSI体系结构(重点)

ISO(国际标准化组织)制定了一个国际标准OSI(开放式通讯系统互联参考模型),对通讯系统进行了标准化(定义了7层模型)。分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,其中应用层为第7层,依次递减,物理层为第1层。

在传输层将数据打包,到数据链层时会对数据进行分帧。

在物理层会将二进制数据转换为高低电平进行数据的传输。 

TCP/IP协议介绍

OSI模型是一个理想化的模型已经很少使用,没有完整的实现,但是模型本身非常通用。

TCP/IP协议是Internet互联网最基本的协议

网络接口与物理层 

网络接口与物理层也叫做网络访问层。

功能:包括ip地址与物理地址的映射(MAC),以及将上一层的ip报文封装层帧,转换成二进制比特流传输。

MAC:物理地址(网卡编号),48bit全球唯一,网络设备的身份标识(cmd ---> ipconfig/all),由厂商出厂后确定。

由电气电子工程协会IEEE定义的。

问:切换网络环境后,MAC地址改不改变,IP地址改不改变?

答:MAC地址不变,IP地址会改变。

ARP/RARP 地址解析协议/逆向地址解析协议

ARP(Address Resolution Protocol):通过ip地址获取其对应的mac地址。

RARP(Reverse Address Resolution Protocol):通过mac地址获取其对应的ip地址。

PPP(Point to Point Protocol)协议:拨号协议(GPRS/3G/4G)

以下哪个协议不是网络访问层的协议? C

A. ARP   B.RARP   C.IP  D.PPP

 网络层

功能:负责在主机之间的通讯中选择数据包传输的路径,即选择路由。

i. IP协议(Internet Protocol)

        ip协议根据数据包的目的ip地址来决定如何投递数据包。

        如果数据包不能直接投递给目标主机,那么ip协议就为他寻找下一个合适的下一跳路由器。

ii. ICMP协议(Internet Control Management Protocol)

        英特网控制管理协议,ping检测网络就是用这个协议

        用于在IP主机、路由器之间传递控制消息

iii. IGMP协议(Internet Group Management Protocol)

        英特网分组管理协议,组播,广播。

传输层

功能:负责提供应用程序之间通讯服务,这种服务又称之为端到端的服务。

传输层与网络层不同,传输层只关心通讯的 起始端目的端,并不在乎数据包的传输中转过程。

传输层两个重要的协议(TCP、UDP):

TCP:(transmission control Protocol 传输控制协议):提供面向连接的,一对一的可靠数据传输协议。

UDP:(user datagram Protocol 用户数据报协议):提供无连接的,不可靠的尽力的传输协议,但是效率更高。

TCP和UDP的异同点:(重点)

相同点:

同属于传输层的协议。

不同点:

TCP --- 稳定

TCP特点:

TCP是提供面向连接的,可靠的数据传输服务。

数据传输过程中,数据无误,数据无丢失,数据无失序,数据无重复到达的通信。

  •         TCP会给每一个数据包编上一个编号,该编号称之为序列号。每一个序列号都需要应答包应答。
    •         应答包:代表收到数据包了,并提示对方下一次从哪个包发送。

传输效率低,占用资源多。

数据的发送和接收是不同步的(不存在数据边界)

        粘包:将多个足够小,且发送间隔极短的包粘成一个包发送,该粘包算法称之为nagle算法。

适用场景:账号密码登录,游戏道具购买等。

UDP特点:

​​​​​​提供无连接的,不可靠的尽力的传输协议。数据有可能在传输过程中丢失,失序,重复到达。

传输效率高,占用资源少。

数据收发是同步的。(存在数据边界):因为效率本身就比较高,不需要粘包处理。但是会限制数据包的大小,超出部分直接删除。

适用场景:适用于发送小尺寸数据,在接收到数据给出应答比较困难的网络中使用。不要求传输质量,只要求实时性的场景。

例如:竞技类游戏。直播,语音视频电话。

IP地址

IP地址是因特网中主机的标识,每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。

IP地址的分类

IPv4:采用的是4个字节无符号整数存储IP地址。(2^32)

        局域网:由路由器设置下发的网络,局域网内的IP地址都是由路由器下发的。局域网内的主机可以直接通信,不需要访问广域网。

                目的:解决IP地址不够用的问题,让多个主机共用一个广域网IP。

        广域网:广域网IP是与广域网通信时使用的IP地址。

IPv6:采用的是16个字节的无符号整数存储IP地址。(2^128)

注意:IPv4和IPv6不兼容。

IP地址划分

 由于IP地址基数比较大,所以为了提高寻径效率,则将IP地址划分为二级地址;

二级地址 = 网络号 + 主机号

        网络号:确定计算机从属的物理网络地址(确定是哪个村子)

        主机号:确定网络号后,用主机号标识该网络号中的所有主机。(确定是哪个村子后,在村子中找设备编号)

注意:

ABC类是基本类,只有ABC类可以作为主机的IP地址,分配给主机使用,也就是只有ABC类才有主机号和网络号之分。

DE两类不表示网络,用于特殊用途,例如组播、广播。

点分十进制

为了方便记忆,使用点分十进制来表示IP地址。将32位IP地址的二进制以8bit为一组,用十进制表示,利用点分割。

A类地址0.0.0.0~127.255.255.2552^7(网络号)2^24(主机号)大型网络
B类地址128.0.0.0~191.255.255.2552^14(网络号)2^16(主机号)名地址网管中心
C类地址192.0.0.0~223.255.255.2552^21(网络号)2^8(主机号)校园网或企业网或家庭网
D类地址224.0.0.0~239.255.255.255组播地址
E类地址240.0.0.0~255.255.255.255保留

特殊的IP地址(即不能分配给主机使用的IP地址):

1.网络地址:用于标识网络,有效网络+主机号全是0的IP地址

        例如:192.168.50.183 -->相应的网络地址是192.168.50.0

                   128.1.2.3 -->相应的网络地址是128.1.0.0

                   12.1.2.3 -->相应的网络地址是12.0.0.0

2.广播地址:用于给局域网内所有的主机发送数据使用,有效网络号+主机号全是1的IP地址

        例如:192.168.50.183 -->相应的广播地址是192.168.50.255

                   128.1.2.3 -->相应的广播地址是128.1.255.255

                   12.1.2.3 -->相应的广播地址是12.255.255.255

下列哪些IP地址可以分配给主机使用 __B C__

A. 230.1.2.3         B.1.2.3.4         C.220.1.2.3         D.244.1.2.3

下列哪些IP地址可以分配给主机使用 ___ABCD___

A. 223.1.2.3         B. 222.1.2.3         C.192.1.2.3         D.10.1.2.3

给定IP:192.168.1.12,请问该IP地址的网络地址是什么,广播地址是什么。请问该网络地址中可用主机号是多少个。主机号个数是多少个?

网络地址是192.168.1.0         广播地址是192.168.1.255

掐头去尾,可用主机号为254个, 主机号个数是256=2^8

子网掩码(重难点)

二级IP地址划分后,主机的基数还是比较大的,所以引入了另外一个概念:子网掩码。

利用子网掩码可以将主机号进行再次划分:

        IP = 网络号 + 子网号 + 主机号

三级划分比较灵活,可以选择划分也可以选择不划分,甚至划分的部分都比较灵活,只要是2的幂次方就行,2,4,8……

1.子网掩码

 子网掩码:用于将一个大的IP网络中的主机号划分为若干小的子网络。其作用如下:

        1.指明一个IP地址的哪些位表示的是主机所在的子网

        2.指明哪些位表示的是主机的位掩码

        3.子网掩码不能单独使用,必须和IP地址结合使用。

2.默认子网掩码

C类IP地址的默认子网掩码:11111111 11111111 11111111 00000000 --> 255.255.255.0

B类IP地址的默认子网掩码:11111111 11111111 00000000 00000000 --> 255.255.0.0

A类IP地址的默认子网掩码:11111111 00000000 00000000 00000000 --> 255.0.0.0

D类和E类没有子网掩码;

C类IP地址的默认子网掩码:11111111 11111111 11111111 00000000 --> 255.255.255.0 

                                             

                                              11111111 11111111 11111111 10000000 --> 255.255.255.128                                               

                                              11111111 11111111 11111111 11000000 -->255.255.255.192                                               

                                              11111111 11111111 11111111 11100000 -->255.255.255.224

                                              11111111 11111111 11111111 11000011-->错误的,1必须连续

3.子网掩码的使用

格式:IP地址&子网掩码得到子网网段

IP: 192.168.50.183 & 子网掩码: 255.255.255.0

        11000000 10101000 00110010 10110111

 &     11111111  11111111   11111111   00000000

======================================

        11000000 10101000 00110010  00000000 -->192.168.50.0 -->子网网段

192.168.50.183是属于192.168.50这个子网网段中的IP地址。

主机号从0~255范围主机,通过这个子网掩码得到的结果均为192.168.50.0 即子网网段。

所以通过默认子网掩码没有划出新的子网网段。

通过默认子网掩码,其中IP地址的后8bit,被0遮掩了,因为在计算子网网段的时候不关心主机号是多少。

也可以写作:192.168.50.0/24 24:代表子网掩码中有24个1,或者说IP地址中有24bit没有被0遮掩。

IP: 192.168.50.183 & 子网掩码: 255.255.255.128

        11000000 10101000 00110010 1 0110111

   &   11111111    11111111  11111111  1 0000000 ======================================

        11000000 10101000 00110010 1 0000000 -->192.168.50.128 -->子网网段

范围:

主机号在[128,255]范围内的主机,& 255.255.255.128,的出来的结果均192.168.50.128/25子网网段。

 通过255.255.255.128该子网掩码可以划分出两个子网网段(前25位:24位有效网络号 + 1位有效子网号)

                        192.168.50.0/25 ---> 128个主机号

                        192.168.50.128/25 ---> 128个主机号

注意:

子网网段的个数 = 2^ (子网掩码中多加的1的个数)

每个子网网段中主机号的个数 = 2^ (子网掩码中0的个数)

特殊的IP地址:

每个子网网段都有自己的子网网段地址,有效地址 + 有效子网号 + 主机号全是0的IP地址。掐头

每个子网网段中都有自己的子网广播地址。去尾

题型1:

        给定IP地址,给定要划出多少个子网,求子网掩码以及主机号个数,可用主机号个数。

  • 130.1.2.3,请问默认子网掩码是什么?若要划出6个子网网段,求子网掩码是什么?主机号个数是多少个?
  1. B类:255.255.0.0
  2. 6-->8个 = 2^3,所以要多加3个1, 255.255.224.0
  3. 子网掩码中剩下13个0,每个网段中主机号个数:2^13个,每个网段中可用主机号个数2^13-2,所有网段中可用的主机号个数2^16-16

题型2:

        每一类的默认子网掩码是什么

  • C类IP地址的默认子网掩码:

                                11111111 11111111 11111111 00000000 --> 255.255.255.0

  • B类IP地址的默认子网掩码:

                                11111111 11111111 00000000 00000000 --> 255.255.0.0

  • A类IP地址的默认子网掩码:

                                11111111 00000000 00000000 00000000 --> 255.0.0.0

题型:

        给定子网网段,计算子网掩码是什么?

  • 192.168.0.64/26,问子网掩码是什么,问该网段的网段地址和广播地址分别是什么

          255.255.255.192

          网段地址 192.168.0.64 广播地址:192.168.0.127

练习:

某个公司有4 部门:行政 研发 售后 营销,每个部门20台电脑接入公司局域网交换机。

如果在192.168.1.0网段划分每个部分的子网,写出所有可用的子网掩码?子网的地址范围是什么?

答:

  • 所以至少划分出4个子网网段:255.255.255. 1100 0000 --> 255.255.255.192 每个子网网段中,主机号的个数为:64个
  • 划分出8个子网网段:255.255.255. 1110 0000 --> 255.255.255.224 每个子网网段中,主机号的个数为:32个

                        192.168.1.2~192.168.1.62 192.168.1.0/26

                        192.168.1.65~192.168.1.126 192.168.1.64/26

                        192.168.1.129~192.168.1.190 192.168.1.128/26

                        192.168.1.193~192.168.1.254 192.168.1.192/26

注解:每个划分出来的部分要去掉子网网段地址和子网广播地址两个IP地址

网关 

概念:网关是一个网络通向其他网络的IP地址。

目前家用路由器一般使用192.168.1.1和192.168.0.1作为LAN接口的地址,这个两个也是最常用的网关地址。

域名系统 

由于使用IP地址来指定计算机不方便人们记忆,且输入时候容易出错,用字符标识网络种计算机名称方法。这种命名方法就像每个人的名字,这就是域名(Domian Name)

域名服务器(Domain Name server):用来处理IP地址和域名之间的转换。

域名系统(Domain Name System,DNS):域名翻译成IP地址的软件

一个域名,可以绑定多个ip

域名结构

例如:

域名 www.baidu.com.cn (从右向左看)

        1.cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国

        2.com为网络名,属于二级域名,它通常表示组织或部门

                  中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等。

        3.baidu为机构名,在此为三级域名,表示百度

        4.www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。

端口号

为了区分一台主机收到的数据包交给哪个进程处理,使用端口号来区分。程序启动后将端口号和进程绑定在一起。

网络里面的通讯是由 IP地址+端口号 来决定

端口号存储在 2个字节 无符号整数中 (unsigned short int),范围是[1, 65535]。

众所周知的端口号:

1~1023端口我们编程时候不要使用,是那些”VIP“应用程序占了

TCP 21端口:FTP文件传输服务

TCP 23端口:TELNET终端仿真服务

TCP 25端口:SMTP简单邮件传输服务

UDP 53端口:DNS域名解析服务

UDP 69端口:TFTP文件传输服务

TCP  80端口:HTTP超文本传输服务

TCP 110端口:POP3邮局协议版本3

TCP 443端口:HTTPS加密超文本传输服务

TCP和UDP的端口号是相互独立的

可以使用的:1024~49151,就是我们平时编写服务器使用的端口号

临时端口号:49152~65535,这部分是客户端运行时候动态选择的(随机选取的时候有可能会往前一点)

跨主机传输

字节序

概念:

  1. 字节序是指不同类型的CPU主机,内存存储 多字节整数 序列的方式。
    1. float, char类型, 字符串,没有字节序
    2. short, int, long, long long有字节序的说法。
  2. 小端字节序:低序字节存储在低地址上。
  3. 大端字节序:低序字节存储在高地址上,高序字节存储在低地址上。

数据的读取顺序:从低地址往高地址读取,将读取出来的内容通过大小端转换得到实际内容。

 

 简述字节序的概念,并用共用体(联合体)的方式计算本机是大端还是小端

1.概念:

  1. 字节序是指不同类型的CPU主机,内存存储 多字节整数 序列的方式。
    1. float, char类型, 字符串,没有字节序
    2. short, int, long, long long有字节序的说法。
  2. 小端字节序:低序字节存储在低地址上。
  3. 大端字节序:低序字节存储在高地址上,高序字节存储在低地址上。
#include <stdio.h>

typedef union
{
    unsigned int a;
    unsigned char b;
}_t;


int main(int argc, const char *argv[])
{
    unsigned int a = 0x87654321;
    char* ptr = (char*)&a;

    if(0x21 == *ptr)
    {
        printf("little-endian\n");
    }                                     
    else if(0x87 == *ptr)
    {
        printf("big-endian\n");
    }

    _t text;
    text.a = 0x01;
    if(0x01 == text.b)
    {
        printf("little-endian\n");
    }
    else
    {
        printf("big-endian\n");
    }

    return 0;
}

 本地字节序与网络字节序

本地字节数:主机字节序(Host Byte Order) HBO

网络字节序(Network Byte Order) NBO,网络字节序规定使用大端字节序。

在跨主机传输过程中,需要使用统一的字节序,即网络字节序,避免兼容性问题。

字节序转换函数
1.htons htonl         其功能是将主机字节序转换为网络字节序
头文件:
       #include <arpa/inet.h>
​
       uint32_t htonl(uint32_t hostlong);
       uint16_t htons(uint16_t hostshort);
参数:
    指定要转换成网络字节序的整型:分别是32bit和16bit;
返回值:
    成功,返回转换后网络字节序的整型
    
#include <stdio.h>
#include <arpa/inet.h>
​
int main(int argc, const char *argv[])
{
    unsigned int a = 0x87654321;
    printf("%#x\n", a);             //0x87654321
    printf("%#x\n", htonl(a));      //0x21436587
​
    printf("%#x\n", htons(a));      //0x2143                 
    
    return 0;
}   
​

2.ntohs ntohl         其功能是将网络字节序转换为主机字节序

头文件:
       #include <arpa/inet.h>
原型:
       uint32_t ntohl(uint32_t netlong);
       uint16_t ntohs(uint16_t netshort);
参数:
    uint32_t hostlong:32位网络字节序整型;
    uint16_t hostshort:16位网络字节序整型;
​
返回值:
    成功,返回转换成主机字节序的整型;

结构体对齐

编译器会对结构体进行对齐,加速CPU取值周期,由于数据对齐也是与操作系统相关,不同的主机如果使用不同的对齐方式,会导致数据无法解析。所以网络传输结构体的时候需要取消结构体对齐;

#include <stdio.h>
​
#pragma pack(1)         //设置默认对齐系数 :()中的参数只能填2^n (n=0,1,2,3,4,5......)  
​
typedef struct
{
    char a;     //1
    int b;      //4
    int d;      //4
}_A;
​
#pragma pack()      //重置默认对其系数,重新置为8
​
typedef struct
{
    char a;     //1
    int b;      //4
    int d;      //4
} __attribute__((packed))  B;       //取消结构体对齐
​
​
typedef struct
{   
    char a;     //1
                //3
    int b;      //4
    int d;      //4
}_C;
​
int main(int argc, const char *argv[])
{   
    printf("%ld\n", sizeof(_A));    //9
    printf("%ld\n", sizeof(_B));    //9
    printf("%ld\n", sizeof(_C));    //12
​
    
    return 0;
}

类型长度

int long int不同操作系统这两个数据类型所占的字节数可能是不一样的

解决方式:可以通过通用类型:uint8_t uint16_t uint32_t

因为涉及到跨平台,不同平台会有不同的字长

#include <stdint.h>
​
typedef struct
{
    uint8_t a;      //1
    uint32_t b;      //4
    uint16_t d;      //2
}_A;

IP转换

由于IP地址本质上是一个4个字节的无符号整数,所以在跨主机传输中也有字节序的概念。

所以需要将IP地址转换成网络字节序。

"192.168.8.189" ---->本机字节序的整型 0xC0A808BD---->网络字节序0xBD08A8C0

"192.168.31.42"----> 0xC0A81F2A ---->0x2A1FA8C0

"192.168.2.145"---->本机字节序的整型0xC0A80291--->网络字节序的整型数0x9102A8C0

1. 点分十进制--->网络字节序

        1)inet_aton

头文件:
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>
原型:
       int inet_aton(const char *cp, struct in_addr *inp);
参数:
    char *cp:源IP地址的点分十进制字符串,例如 “192.168.1.10”;
    struct in_addr *inp:存储转换成网络字节序的IP;
           typedef uint32_t in_addr_t;
           struct in_addr {
               in_addr_t s_addr;
           };
返回值:
    成功,返回非0;
    失败,返回0;
​
只能转换IPv4
    
例子:
 #define IP  "192.168.1.10"      //0xC0A8010A
 int main(int argc, const char *argv[])
 {
     struct in_addr inp;
 
     if(inet_aton(IP, &inp) == 0)
     {
         printf("转换失败\n");
         return -1;
     }
 
     printf("%#X\n", inp.s_addr);    //0X0A01A8C0
                                                           
     return 0;
 }                         

        2)inet_pton

既可以转IPv4也能处理IPv6

头文件:
       #include <arpa/inet.h>
原型:
       int inet_pton(int af, const char *src, void *dst);
参数:
    int af:协议族
            AF_INET         IPV4
            AF_INET6        IPV6
     char *src:指定要转换成网络字节序的点分十进制字符串;
     void* dst
           typedef uint32_t in_addr_t;
           struct in_addr {
               in_addr_t s_addr;
           };
​
            af == AF_INETa;
            struct in6_addr
            {

            }
返回值:
    成功,返回1;
    失败,返回0或者-1,更新errno;
​
#define IP "192.168.1.3" //0xC0A80103 --> 0x301A8C0 
​
    struct in_addr inp;
    inet_pton(AF_INET, IP, &inp);
    printf("%#X\n", inp.s_addr);        //0x301A8C0 

        3)inet_addr 最常用

头文件:
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>
原型:
       uint32_t inet_addr(const char *cp);
参数:
     char *cp:源IP地址的点分十进制字符串,例如 “192.168.1.10”;
返回值:
    成功,返回转换后的网络字节序IP地址;
                    typedef uint32_t in_addr_t;
​
    失败,返回INADDR_NONE (usually -1);
​
只能转换IPv4;
​
​
例子:
    printf("%#X\n", inet_addr(IP));

2. 网络字节序--->点分十进制

        1)inet_ntoa 常用

头文件:
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>
原型:
       char *inet_ntoa(struct in_addr in);
参数:
    struct in_addr in:指定要转换成点分十进制字符串的IP地址;
           typedef uint32_t in_addr_t;
           struct in_addr {
               in_addr_t s_addr;
           };
返回值:
    成功,返回点分十进制字符串的首地址;
​
只能转换IPv4;
​
printf("%s\n", inet_ntoa(inp));

        2)inet_ntop

头文件:
       #include <arpa/inet.h>
原型:
       const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数:
    int af:协议族
            AF_INET         IPV4
            AF_INET6        IPV6
    void* src:存储要转换成点分十进制字符串的IP首地址;
           typedef uint32_t in_addr_t;
           struct in_addr {
               in_addr_t s_addr;
           };
​
            af == AF_INETa;
            struct in6_addr
            {
            }
    char *dst:存储转换后的结果,点分十进制的首地址;
    socklen_t size:缓冲区大小,其实就是指定多大的空间用于转换IP;
返回值:
    成功,返回字符串的首地址,就是dst;
    失败,返回NULL,更新errno;     
​
例子:
     char ip[20];
     if(inet_ntop(AF_INET, &inp, ip, sizeof(ip)) == NULL)
     {
         perror("ient_ntop");
         return -1;                                            
     }
     printf("%s\n", ip);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值