ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深入浅出IP地址

2021-12-26 13:02:54  阅读:214  来源: 互联网

标签:addr 深入浅出 网络 地址 IP地址 include inet


深入浅出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地址中提取网络标识

幻灯片7

幻灯片8

  • 深入理解子网掩码

幻灯片10

  • 特殊的地址
    • 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

网络编程中的地址类型

幻灯片13

幻灯片14

  • 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;
}

标签:addr,深入浅出,网络,地址,IP地址,include,inet
来源: https://blog.csdn.net/LangLang_2020/article/details/122153956

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有