参考:网络编程前的一些小知识–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)

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

  1. Linux网络编程基础知识

    Linux网络编程基础知识 1. 协议的概念 1.1 什么是协议 1.2 典型协议 2 网络应用程序设计模式 2.1 C/S模式 2.2 B/S模式 2.3 优缺点 3 分层模型 3.1 OSI七层模 ...

  2. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in {uint8_t sinlen;(4个字节)sa_family_t sin_family;(4个字节)in_port_t sin_port ...

  3. linux 网络编程相关知识

    1:tcp和udp的区别 2:流量控制和拥塞控制的实现机制 3:滑动窗口的实现机制 4:多线程如何同步. 5:进程间通讯的方式有哪些,各有什么优缺点 6:tcp连接建立的时候3次握手的具体过程,以及其 ...

  4. linux网络编程中端口号和ip地址转换方法

    0.字节序 网络字节序:是大端序,即:高字节放在低地址位置 比如:0x7F000101 对于一个整型,如上,我们看到的该形式,只是在大小端主机中存储的顺序是相反的. 网络序的存储方式是  7F 00 ...

  5. 网络编程大小端字节序

    刚接触网络编程那会因为是同一种语言之间做数据交互所以并没有出现大小端问题,到后来鄙人因机缘巧合进入物联网行业然后就发现打开了新世界.(设备终端大多是嵌入式设备用的C,服务端用的是java) 然后我的状 ...

  6. Linux 网络编程学习笔记——二、IP 协议详解

    目录 一.IP 服务的特点 IP 协议为上层协议提供无状态.无连接.不可靠的服务: 无状态(stateless):指 IP 通信双方不同步传输数据的状态信息,因此所有 IP 数据报的发送.传输和接收都 ...

  7. 【Socket网络编程】3.字节序转换函数htons、htonl ,地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr

    字节序转换函数htons.htonl 地址转换函数inet_ntoa.inet_ntop.inet_pton.inet_addr 1.字节序转换函数 #include <arpa/inet.h& ...

  8. linux网络编程-----几种服务器模型及io多路复用函数

    libevent实现了对io多路复用函数的封装,复习一下linux下的io复用函数,select,poll,epoll 在c/s模型中,要处理多个客户端的请求以达到并发处理的效果,有以下几种方法 主线 ...

  9. Linux网络编程小项目sqlite,嵌入式数据库sqlite

    *************************************** * 嵌入式数据库sqlite在LPC22XX上的应用 * ******************************* ...

最新文章

  1. 浅谈如何在C#Winform程序中正确使用登录窗体
  2. 关于STM32的延时问题
  3. JZOJ 3807. 【NOIP2014模拟8.25】地砖铺设
  4. 大象喝水c语言程序,实现大象喝水(c语言)
  5. 《文明之光 第二册》一一10.1 罗卡尔角的夕阳—— 葡、西的殖民时代(1)
  6. java jdbc reparecall_Java Connection.prepareCall方法代碼示例
  7. 百度地图API如何申请?(自认为比较详细,如解决了你的问题请收藏、点赞、关注!)
  8. javascript使用_用JavaScript唤醒沉睡的城市
  9. Prometheus监控学习笔记之360基于Prometheus的在线服务监控实践
  10. 4010-基于邻接矩阵的边的删除(C++,附思路)
  11. 523. 连续的子数组和
  12. JAVA根据word模板动态生成word(SpringBoot项目)
  13. 计算机专业数学建模结课论文,大学生数学建模论文范文
  14. C#两套WPF,看板和WPF工业组件
  15. 2021.4.17日简报:五子登科、BMEX、优选家、加电、链淘等项目
  16. py3_VSCode 配置 Python 环境以及初识 Python 正则表达式
  17. 腾讯云php小程序,使用微信小程序和腾讯云实现直播功能
  18. postman发送图片
  19. 一文看懂芯片后端报告
  20. 为什么后端显示修改成功,但数据库的数据却没有改变

热门文章

  1. html5播放视频只有声音不出现画面?
  2. Android JNI开发系列(二)HelloWorld
  3. Arduino从DHT11读取温湿度数据并显示在1602LCD
  4. 移动wabAPP 开发 viewport 注意事项
  5. c#通过app.manifest使程序 右键 以管理员身份运行
  6. android 获取应用的资源id和uri
  7. webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)...
  8. Windows 2003下网络负载平衡(负载均衡)的配置
  9. 再学 GDI+[91]: TGPImage(11) - 转灰度图像
  10. Microsoft CRM 3.0 Mobile安装手记(二)——Server端安装