Linux网络编程小知识(字节序、IP格式、函数、子网掩码、DNS域名解析代码实现)

参考:网络编程前的一些小知识–Linux笔记
作者:一只青木呀
发布时间: 2021-04-12 23:19:10
网址:https://blog.csdn.net/weixin_45309916/article/details/115560197

参考:DNS域名解析
作者:一只青木呀
发布时间: 2021-04-18 12:48:39
网址:https://blog.csdn.net/weixin_45309916/article/details/115825036

目录

  • 大端与小端
  • 本地字节序(小端)
  • 网络字节序(大端)
  • IP格式
    • 点分十进制转换成『二进制』
    • 网络字节序的二进制转『点分十进制』
    • 点分十进制转网络字节序的『二进制』
  • 常用的比较好的函数
  • 子网掩码
    • 子网掩码的组成
    • 子网掩码的表示方式
    • 子网掩码的运算
  • DNS域名解析
    • 原理
    • 代码实现
    • 测试

大端与小端

对一个多字节的数字来说在内存中的存储是有顺序的,一般分为大端与小端:

例如:0x12345678

靠近0x的为大端,尾巴为小端

本地字节序(小端)

在我们的内存中一般都是采用小端的方式存取,也就是小端在前大端在后:

0x78 0x56 0x34 0x12

网络字节序(大端)

但是在我们的网络传输中一般都是采用大端的方式传输,也就是大端在前小端在后的顺序:

0x12 0x34 0x56 0x78

IP格式

一般的IP格式分为点分十进制(字符串形式)二进制的格式(int类型)

点分十进制转换成『二进制』

in_addr_t inet_addr(const char *cp) //转换网络主机地址(点分十进制)为网络字节序二进制值

一般在TCP的绑定中,sockaddr_in这个结构体的填充时会使用到

在处理地址为255.255.255.255时也返回-1,虽然它是一个有效地址,但inet_addr()无法处理这个地址

点分十进制(Dotted Decimal Notation)全称为点分(点式)十进制表示法,是IPv4的IP地址标识方法。IPv4中用四个字节表示一个IP地址,每个字节按照十进制表示为0 ~ 255。点分十进制就是用4个从0~255的数字,来表示一个IP地址。如192.168.1.1

网络字节序的二进制转『点分十进制』

char *inet_ntoa(struct in_addr in)

功能是将网络地址转换成“.”点隔的 字符串格式,方便我们在网络编程的时候打印查看IP地址

点分十进制转网络字节序的『二进制』

int inet_aton(const char *cp, struct in_addr *inp)

功能是将一个字符串IP地址转换为一个32位的网络序列IP地址。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零

该函数返回值指向保存点分十进制的字符串地址的指针,该字符串的空间为静态分配 的,所以在第二次调用这个函数时,意味着上一次调用并保存的结果将会被覆盖(重写)。

常用的比较好的函数

int inet_pton(int family, const char *strptr, void *addrptr)const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len)

现在一般都是采用inet_pton代替inet_addr
inet_ntop代替inet_ntoa

inet_pton源码:

int inet_pton(int family, const char *strptr, void *addrptr)
{if (family == AF_INET) {struct in_addr  in_val;if (inet_aton(strptr, &in_val)) {memcpy(addrptr, &in_val, sizeof(in_val));return (1);}}errno = EAFNOSUPPOPT;return (-1);
}

inet_ntop源码:

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len)
{const u_char *p = (const u_char*)addrptr;if (family == AF_INET) {char temp[INET_ADDRSTRLEN];snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);if (strlen(temp) >= len) {errno = ENOSPC;rturn (NULL);}strcpy(strptr, temp);return (strptr);}errno = EAFNOSUPPOPT;return (NULL);
}

子网掩码

当前使用的IP地址有4个字节(32)组成,即IPV4编码方式。每个IP地址包换两部分:网络号和主机号。

IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据。

这里是引用

子网掩码的组成

子网掩码是由长度为32位二进制数组成的一个地址,子网掩码32位与IP地址32位相对应,IP地址如果某位是网络地址,则子网掩码为1,否则为0,例如:11111111.11111111.11111111.00000000(255.255.255.0)

子网掩码的表示方式

  • ①、11111111.11111111.11111111.00000000表示255.255.255.0

  • ②、IP/24 同样表示 11111111.11111111.11111111.00000000(斜杠后面的数字代表着1的个数)

子网掩码的运算

子网掩码与IP之间的运算采用“按位与”的方式计算

例如:网上找个例子
在这里插入图片描述
按位与,采用有0则0的原则计算,得到192.168.10.0

网络地址计算小技巧:IP地址和子网掩码做与运算,把IP地址的主机位直接归0,就快速得到网络地址。所以只要一看到IP地址和子网掩码,就能马上确认网络地址。

DNS域名解析

原理

我在在通过域名解析获取IP的过程中一般使用的是DNS域名解析。

DNS协议是一种应用层协议,他是基于UDP来实现的。
在这里插入图片描述

代码实现

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>extern int h_errno;int main(int argc, char **argv)
{char   *ptr, **pptr;char    str[INET_ADDRSTRLEN];struct hostent *hptr;  //while (--argc> 0) {ptr = *++argv;  //传入的域名if ( (hptr = gethostbyname (ptr) ) == NULL)   //完成域名解析{printf("gethostbyname error for host: %s: %s",ptr, hstrerror (h_errno) );continue;}printf ("official hostname: %s\n", hptr->h_name);for (pptr=hptr->h_aliases; *pptr!= NULL; pptr++)printf ("\talias: %s\n", *pptr);switch (hptr->h_addrtype) {case AF_INET:pptr = hptr->h_addr_list;for ( ; *pptr != NULL; pptr++)printf ("\taddress: %s\n",inet_ntop (hptr->h_addrtype, *pptr, str, sizeof (str)));  //hptr->h_addrtype我们获取的IP地址break;default:printf("unknown address type");break;}}exit(0);
}

测试

在这里插入图片描述

详细的DNS知识可继续参照这篇博文:DNS服务(域名系统、过程、bind、配置文件、查看本设备dns)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java ndk 在哪_NDK简介

一、NDK简介&#xff1a;C/C的动态库。Dalvik通过JNI编程方式调用C/C代码。NDK编程提高软件性能&#xff0c;加密保护APK文件ndk-build NDK编译生成脚本Java编译时会根据java声明文件生成dex文件&#xff0c;即使没有java代码NDK共享库&#xff1a;NDK生成的 .so文件(类…

ARM汇编基础详解(PS学习汇编的原因)

目录前言1.GNU 汇编语法2.Cortex-A7 常用汇编指令2.1 处理器内部数据传输指令&#xff08;内部寄存器数据非内存数据&#xff09;2.2 存储器访问指令&#xff08;RAM&#xff09;2.3 压栈和出栈指令&#xff08;了解&#xff09;2.4 跳转指令2.5 算术运算指令2.6 逻辑运算指令前…

java formatter()_Java Formatter locale()用法及代码示例

locale()方法是java.util.Formatter的内置方法&#xff0c;该方法返回语言环境。此区域设置由格式化程序构造设置。具有语言环境参数的该对象的format方法不会更改此值。用法&#xff1a;public Locale locale()参数&#xff1a;该函数不接受任何参数。返回值&#xff1a;如果未…

linux中tree命令

需要安装tree包(安装&#xff1a;yum -y install tree)。 tree命令的选项说明如下&#xff1a; 【 匹配选项&#xff1a;】 -L&#xff1a;用于指定递归显示的深度&#xff0c;指定的深度必须是大于0的整数。 -P&#xff1a;用于显示统配符匹配模式的目录和文件&#xff0c;但是…

查看LINUX进程内存占用情况

可以直接使用top命令后&#xff0c;查看%MEM的内容。可以选择按进程查看或者按用户查看&#xff0c;如想查看oracle用户的进程内存使用情况的话可以使用如下的命令&#xff1a; (1)top top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况…

ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机汇编LED驱动实验–驱动编写 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-07 09:13:48 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107851318 参考&#xff1a;Linux之…

Tools: geos 使用指南

1. 下载geos 2. 进入VS开发人员命令提示3、依次执行如下命令 >VCVARS32.BAT>cd D:\DevTool\geos-3.7.0>atuogen.bat>nmake /f makefile.vc> 编译成功后&#xff0c;会在D:\DevTool\geos-3.7.0\src目录下生成geos.lib, geos_i.lib, geos_c_i.lib, geos.dll, geos…

java 面试 概率论_编程培训-115个Java面试题和答案B.pdf

编程培训-115个Java面试题和答案B.pdf “玩转”Java系列 1 题目115个Java面试题和答案终极(下) 第一篇讨论了面向对象编程和它的特点&#xff0c;关于Java和它的功能的常见问题&#xff0c;Java的集合类&#xff0c; 垃圾收集器&#xff0c;本章主要讨论异常处理&#xff0c;Ja…

An Introduction to Our Code Breaking Team

小朋友们大家好&#xff0c;知道我们是谁吗&#xff1f;对了&#xff0c;我们就是Team Code Breaking&#xff01; 关于这个队名&#xff0c;我们讨论了很久&#xff0c;这个Code Breaking似乎是来源于某部电影&#xff0c;又似乎是来源于某本小说&#xff0c;或许单纯地只是觉…

ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机之I.MX6ULL启动方式详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 16:32:07 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107891591 目录启动方式的选择①.串行下…

python 操作mongo

1.  导包&#xff1a; import pymongo 2.  建立连接 client pymongo.MongoClient("127.0.0.1",27017) 3.  获取数据库 db client["test1"] 4.  获取集合 col db["t2"] 5.  插入数据&#xff1a; col.insert_one({ name:aa , age:2 …

java 混码_kotlin java 混合代码 maven 打包实现

kotlin简介kotlin是一种针对java 平台的新编程语言。kotlin简洁、安全、务实&#xff0c;并且专注于与java代码的互操作性。它几乎可以用在现在java使用的任何地方&#xff1a;服务端开发、android应用等等。kotlin 可以很好地和所有现存的java库和框架一起工作&#xff0c;而且…

w3 protocol

http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

ARM(IMX6U)裸机之I.MX6ULL启动头文件详解(内部BOOT ROM、IVT + Boot data + DCD + led.bin)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机之I.MX6ULL镜像烧写以及启动头文件的详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 17:10:00 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107895975 目录BOOT R…

oracle日期函数

ORACLE日期函数大全&#xff01;2009-03-12 14:16:10日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历&#xff0c;比如&#xff0c;要统计财务的情况&#xff0c;可能要按每年&#xff0c;每季度&#xff0c;每月&#xff0c;甚至每个星期来分别统…

(转)git遇到的问题之“Please make sure you have the correct access rights and the repository exists.”...

对于git的提交一直很小心翼翼&#xff0c;感觉一不小心就会踩到莫名的坑。 这不&#xff0c; 某天commit 就遇到了On branch master nothing to commit (working directory clean) 一查意思。你的分支很干净&#xff1f; 干净&#xff1f;excuse me&#xff1f; 然后git push …

php 数组降维,php 数组去重的方法参考(一维数组去重、二维数组去重)

本文介绍下&#xff0c;对php数组去除重复的方法&#xff0c;包括一维数组的去重、二维数组的去重。有需要的朋友参考下。首先&#xff0c;来看一维数组重复项的去除方法。使用array_unique函数&#xff0c;例如&#xff1a;输出结果&#xff1a;Array ( [0] > apple [1] &g…

ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机C语言LED驱动实验–驱动编写,编译 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-11 11:20:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107930284 目录0.简介①、汇编…

IBM TS3200 Drive故障处理方案

一、故障定位1.1.故障信息截图摘要1.2.故障定位通过网线连接带库&#xff0c;进入Web管理模式从右边告警得到信息&#xff1a;Drive Broken Code :F3 02 SCD:5 ; Exception F3 52 –Error 经第二张图片定位&#xff0c;确认Drive 2故障需要更换一块Drive 模块此部件支持热插拔&…

常用模块-01

本节主要内容: 1. 模块的简单认识 2. collections模块 3. time时间模块 4. random模块 5. os模块 6. sys模块 一. 模块的简单认识 什么是模块. 模块就是我们把装有特定功能的代码进行归类的结果. 从代码编写的单位 来看我们的程序, 从小到大的顺序: 一条代码 < 语句块 < …