自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

whowin

开源和分享是技术发展的动力,所有文章均为原创

  • 博客(52)
  • 收藏
  • 关注

原创 使用ioctl扫描wifi信号获取信号属性的实例(二)

使用工具软件扫描wifi信号是一件很平常的事情,在知晓wifi密码的前提下,通常我们会尽可能地连接信号质量比较好的wifi信号,但是如何通过编程来扫描wifi信号并获得这些信号的属性(比如信号强度等),却鲜有文章提及,本文在前面博文的基础上通过实例向读者介绍如何通过编程扫描wifi信号,并获得信号的一系列的属性,本文给出了完整的源代码,本文程序在ubuntu 20.04下编译测试完成;阅读本文并不需要对IEEE802.11协议有所了解,本文实例中大量涉及链表和指针,所以本文可能不适合初学者阅读。

2024-04-13 11:42:19 146

原创 使用epoll()进行socket编程处理多客户连接的TCP服务器实例

在网络编程中,当需要使用单线程处理多客户端的连接时,常使用select()或者poll()来处理,但是当并发数量非常大时,select()和poll()的性能并不好,epoll()的性能大大好于select()和poll(),在编写大并发的服务器软件时,epoll()应该是首选的方案,本文介绍epoll()在网络编程中的使用方法,本文提供了一个具体的实例,并附有完整的源代码。

2024-03-12 10:50:29 198

原创 使用poll()代替select()处理多客户连接的TCP服务器实例

在网络编程中,使用select()处理多客户端的连接是非常常用的方法,select()是一个非常古老的方法,在大量连接下会显得效率不高,而且其对描述符的数值还有一些限制,Linux内核从2.1.13版以后提供了poll()替代select(),本文介绍poll()在网络编程中的使用方法,并着重介绍poll()在编程行与select()的区别,旨在帮助熟悉select()编程的程序员可以很容易地使用poll()编程,本文提供了一个具体的实例,并附有完整的源代码,本文实例在 ubuntu20.04下编译测试通过

2024-03-04 16:20:48 171

原创 使用signal中止阻塞的socket函数的应用实例

在 socket 编程中,有一些函数是阻塞的,为了使程序高效运行,有一些办法可以把这些阻塞函数变成非阻塞的,本文介绍一种使用定时器信号中断阻塞函数的方法,同时介绍了一些信号处理和定时器设置的编程方法,本文附有完整实例的源代码,本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文不适合 Linux 编程的初学者阅读。

2024-01-28 07:08:16 70

原创 在ubuntu上的18个非常实用的命令行工具软件

使用Ubuntu的过程中,在终端上使用命令行工具是非常常见的事情,熟练地掌握命令行工具是使用ubuntu必不可少的技能,即便是Ubuntu的初学者,通常也很熟悉诸如ls、rm、cp等一些文件操作工具,当浏览/bin目录时,你会发现Ubuntu还有许多工具软件,本文将向读者简单介绍18个在Ubuntu上使用的命令行工具软件,本文不会详细介绍每个命令的用法,有对某个命令感兴趣的读者可以自行查找更详细的资料或者使用man在线手册,本文非常适合初学者阅读。

2024-01-13 13:39:55 1976

原创 IPC之十六:D-Bus的标准接口、自省机制和服务接口的具体实现方法

D-Bus的规范中提供了一系列的标准接口,绝大多数有D-Bus接口的系统调用都会实现这些标准接口,这些标准接口中包括D-Bus的自省(Introspection)机制,自省机制可以让我们通过一个标准接口了解一个D-Bus服务的各种方法的调用方法,本文将介绍D-Bus的这些标准接口及实现方式,同时也会介绍如何在D-Bus上提供自有服务,本文附有完整的实例和完整的源代码;本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文不适合 Linux 编程的初学者阅读。

2024-01-11 12:01:24 542

原创 在ubuntu上检查内存使用情况的九种方法

在 Ubuntu 中,可以通过 GUI(图形用户界面)和命令行使用多种方法来监视系统的内存使用情况,监视 Ubuntu 服务器上的内存使用情况并不复杂;了解已使用和可用的内存量对于故障排除和优化服务器性能至关重要,因为内存对系统 I/O 速度至关重要,定期监控内存使用情况有助于诊断潜在的系统问题和优化服务器性能,还可以帮助使用者确定是否需要扩充内存;本文将简要描述在 Ubuntu 上使用命令和工具监视内存使用情况的各种方法。

2024-01-11 07:12:07 11252

原创 IPC之十五:使用libdbus通过D-Bus请求系统调用实现任意DNS记录解析的实例

关于D-Bus的文章中曾介绍了如何通过D-Bus调用系统服务从而实现解析出一个域名的IP地址的过程,本文我们继续调用系统调用来实现解析任意DNS记录,系统调用的方法与前一篇文章类似,只是方法名称和调用参数以及返回参数不同,本文将详细介绍systemd-resolved服务中的ResolveRecord方法,同前面几篇关于D-BUS的文章相同,本文将使用 libdbus 库实现系统服务的调用,本文给出了实现解析任意DNS记录的实例,附有完整的源代码;本文不适合 Linux 编程的初学者阅读。

2024-01-10 03:42:36 733 2

原创 IPC之十四:使用libdbus通过select()接收D-Bus消息的实例

在『进程间通信』系列文章中前面已经有三篇关于D-Bus的文章,本文继续讨论D-Bus;libdbus抽象了实现IPC时实际使用的方式(管道、socket等),libdbus允许在一个D-Bus连接上添加一个watch,通过watch对实际IPC中使用的文件描述符进行监视,本文讨论了如何在D-Bus连接中添加watch,如何使用在socket编程中常用的select从D-Bus返回的文件描述符中接收到D-Bus消息,本文给出了具体实例,附有完整的源代码;本文不适合Linux编程的初学者阅读。

2024-01-10 03:23:28 597

原创 IPC之十三:使用libdbus通过D-Bus请求系统调用实现域名解析的实例

前面两篇有关 D-Bus 的文章介绍了使用 libdbus 库进行进程间的方法调用和信号的传输,实际上 D-Bus 的更强大的地方是其建立了与大量系统服务之间建立了有效的对话规范,使得应用程序可以使用标准的方式调用系统服务的方法,访问系统服务中的一些开放的属性,本文将使用 libdbus 库调用系统服务中的方法从而实现域名解析,本文给出了实现该功能的实例,附有完整的源代码;本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文不适合 Linux 编程的初学者阅读。

2024-01-02 09:08:15 1102

原创 IPC之十二:使用libdbus在D-Bus上异步发送/接收信号的实例

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本 IPC 系列文章的前十篇介绍了几乎所有的常用的 IPC 方法,每种方法都给出了具体实例,前面的文章里介绍了 D-Bus 的基本概念以及调用远程方法的实例,本文介绍 D-Bus 的异步处理机制,以及信号处理的基本方法,本文给出了异步处理 D-Bus 的实例,附有完整的源代码;本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文不适合 Linux 编程的初学者阅读

2024-01-02 08:36:36 1234

原创 IPC之十一:使用D-Bus实现客户端向服务端请求服务的实例

IPC是Linux编程中一个重要的概念,IPC有多种方式,本IPC系列文章的前十篇介绍了几乎所有的常用的IPC方法,每种方法都给出了具体实例,本文介绍在Linux下IPC的另外一种实现,D-Bus,D-Bus是一种用于进程间通信的消息总线系统,它提供了一个可靠且灵活的机制,使得不同进程之间能够相互通信,本文给出了使用D-Bus进行基本IPC的实例,并附有完整的源代码;本文不适合Linux编程的初学者阅读。

2023-12-29 01:52:03 1002 1

原创 IPC之十:使用共享文件进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,常用的 IPC 方式有管道、消息队列、共享内存等,但其实使用广大程序员都熟悉的文件也是可以完成 IPC 的,本文介绍如何使用共享文件实现进程间通信,本文给出了具体的实例,并附有完整的源代码;本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文的实例中涉及多进程编程、文件锁等概念,所以对 Linux 编程的初学者有一些难度,但对于了解 Linux 下共享文件,特别是文件锁的应用,将是非常难得的。

2023-12-26 02:26:53 1027

原创 IPC之九:使用UNIX Domain Socket进行进程间通信的实例

socket编程是一种用于网络通信的编程方式,在socket的协议族中除了常用的AF_INET、AF_RAW、AF_NETLINK等以外,还有一个专门用于IPC的协议族AF_UNIX,IPC是Linux编程中一个重要的概念,常用的IPC方式有管道、消息队列、共享内存等,本文主要介绍用于本地进程间通信的UNIX Domain Socket,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在Ubuntu 20.04上本文的实例中涉及多进程编程等,本文对Linux编程的初学者有一些难度。

2023-12-22 02:34:59 1806

原创 IPC之八:使用 POSIX 共享内存进行进程间通信的实例

IPC是Linux编程中一个重要的概念,IPC有多种方式,本文主要介绍共享内存(Shared Memory),因为没有像管道、消息队列这样的中介介入,所以通常认为共享内存是迄今为止最快的IPC方式;Linux既支持UNIX SYSTEM V的共享内存段,也支持POSIX的共享内存对象,本文针对POSIX共享内存对象,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文的实例中涉及多进程编程和号处理等,阅读本文还需要一些基本的内存管理知识,本文对 Linux 编程的初学者有一些难度。

2023-12-19 02:13:51 925

原创 IPC之七:使用 System V 共享内存段进行进程间通信的实例

IPC是Linux编程中一个重要的概念,IPC有多种方式,本文主要介绍共享内存(Shared Memory),因为没有像管道、消息队列这样的中介介入,所以通常认为共享内存是迄今为止最快的IPC方式;Linux既支持UNIX SYSTEM V的共享内存,也支持POSIX的共享内存,本文针对System V共享内存段,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在Ubuntu 20.04上编译测试通过;本文的实例中涉及多进程编程和信号处理等,对初学者有一定难度。

2023-12-15 13:55:06 397

原创 我在战争中走入了计算机行业

一个退休程序员讲述30多年前进入计算机行业的故事。

2023-12-13 09:25:12 192 1

原创 IPC之六:使用 POSIX 信号量解决经典的‘生产者-消费者问题‘

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍信号量(Semaphores),尽管信号量被认为是 IPC 的一种方式,但实际上通常把信号量用于进程间同步或者资源互斥,和共享内存(Shared Memory)配合使用,可以实现完美的进程间通信;Linux 既支持 UNIX SYSTEM V 的信号量集,也支持 POSIX 的信号量,本文针对 POSIX 信号量,本文给出了多个具体的实例,每个实例均附有完整的源代码。

2023-12-12 02:23:49 388

原创 IPC之五:使用 System V 信号量集解决经典的‘哲学家就餐问题‘

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍信号量集(Semaphore Sets),尽管信号量集被认为是 IPC 的一种方式,但实际上通常把信号量集用于进程间同步或者资源访问互斥,信号量集和共享内存(Shared Memory)配合使用,可以实现完美的进程间通信;Linux 既支持 UNIX SYSTEM V 的信号量集,也支持 POSIX 的信号量集,本文仅针对 SYSTEM V 信号量集;本文给出了多个具体的实例,每个实例均附有完整的源代码。

2023-12-08 09:27:32 413

原创 IPC之四:使用 POSIX 消息队列进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍消息队列(Message Queues),消息队列可以完成同一台计算机上的进程之间的通信,相比较管道,消息队列要复杂一些,但使用起来更加灵活和方便,Linux 既支持 UNIX SYSTEM V 的消息队列,也支持 POSIX 的消息队列,本文针对 POSIX 消息队列,POSIX 标准引入了一个简单的基于文件的接口,使应用程序可以轻松地与消息队列进行交互;本文给出了多个具体的实例,每个实例均附有完整的源代码。

2023-12-08 09:11:11 447

原创 IPC之三:使用 System V 消息队列进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍消息队列(Message Queues),消息队列可以完成同一台计算机上的进程之间的通信,相比较管道,消息队列要复杂一些,但使用起来更加灵活和方便,本文针对 System V 消息队列,并给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文适合 Linux 编程的初学者阅读。

2023-08-08 17:40:43 287

原创 IPC之二:使用命名管道(FIFO)进行进程间通信的例子

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍命名管道(FIFO),命名管道可以完成同一台计算机上的进程之间的通信,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文适合 Linux 编程的初学者阅读。

2023-08-08 17:32:37 255

原创 IPC之一:使用匿名管道进行父子进程间通信的例子

IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本文主要介绍匿名管道(又称管道、半双工管道),尽管很多人在编程中使用过管道,但一些特殊的用法还是鲜有文章涉及,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文适合 Linux 编程的初学者阅读

2023-08-08 17:25:56 166

原创 使用ioctl扫描wifi信号获取信号属性的实例(一)

使用 wifi 是一件再平常不过的是事情,有很多 wifi 工具可以帮助你扫描附近的 wifi 信号,测试信号强度等,但如何通过编程来操作 wifi 却鲜有文章涉及;本文立足实践,不使用任何第三方库,仅使用 ioctl 扫描附近的 wifi 信号,并获取这些 AP 的 ESSID、MAC 地址、占用信道和工作频率,本文将给出完整的源程序,今后还会写一些文章讨论如果编程获取 wifi 信号的其它属性(比如:信号强度、加密方式等)的方法,敬请关注;本文程序在 ubuntu 20.04 下编译测试完成,gcc 版

2023-07-02 19:53:44 873 2

原创 使用SOCK_DGRAM类型的socket实现的ping程序

SOCK_DGRAM类型的socket常用于UDP通信,本文将尝试把这种socket用于ICMP协议,并完成一个简单的ping程序。使用ping去测试某个主机是否可用可能是一件很平常的事,尽管ping非常普通,但是编写一个实现ping功能的程序却并不是那么简单,因为ping使用的ICMP协议并不是一个应用层协议,本文简要介绍ICMP协议,并给出一个使用普通的常用于UDP通信的socket实现ping的实例,本文将提供完整的源程序;阅读本文需要熟悉socket编程,对初学者而言,本文有一定的难度。

2023-04-28 14:32:34 1292

原创 用C语言实现的一个DNS客户端

DNS可以帮助我们把域名映射到一个IP地址上,或者查询一个IP地址下有那些域名,使用域名访问一个网站或者服务器是一件很平常的事情,很少有人关心域名变成IP地址的实际过程,本文将使用C语言实现一个基本的DNS解析器,通过与DNS服务器的通信完成将一个域名转换成IP地址的过程,本文将提供完整的源程序;阅读本文需要有一定的网络编程基础,熟悉基本的socket编程并对DNS有一些了解,本文对网络编程的初学者难度较大。

2023-04-24 22:40:05 1007

原创 使用tun虚拟网络接口建立IP隧道的实例

通常的socket编程,面对的都是物理网卡,Linux下其实很容易创建虚拟网卡;本文简单介绍一下Linux虚拟网卡的概念,并以tun设备为例在客户端和服务器端分别建立一个实际的虚拟网卡,最终实现一个从客户端到服务器的简单的IP隧道,希望本文能对理解虚拟网卡和IP隧道有所帮助,本文将提供完整的源程序;阅读本文需要具备在Linux下使用C语言进行IPv4下socket编程的基本能力,本文对网络编程的初学者难度较大。

2023-04-21 10:49:01 831

原创 使用SNTP协议从时间服务器同步时间

在互联网上校准时间,是每台联网计算机都要去做的事情,而且很多是在后台完成的,并不需要人工干预;互联网上有很多时间服务器可以发布精确的时间,计算机客户端使用NTP(Network Time Protocol)协议与这些时间服务器进行时间同步,使本机得到精确时间,本文简要描述了NTP协议的原理,对NTP协议的时间同步精度做了简要分析,并具体实现了SNTP下的客户端,本文附有完整的C语言SNTP客户端的源程序。阅读本文只需掌握基本的socket编程即可,本文对网络编程的初学者难度不大。

2023-04-18 10:57:34 1288

原创 简单的路由表查找程序

在Linux操作系统中,内核中有一个路由表,它包含若干条路由记录,这些记录由子网IP、子网掩码、网关IP和接口名等组成,这些信息用于将数据包转发到其他子网或者连接到互联网;本文介绍了当需要转发数据包时,Linux内核查找路由表的基本算法,并用程序模拟了这个过程,附有完整的源代码。本文对网络编程的初学者难度不大。

2023-04-16 12:42:40 600

原创 使用raw socket发送magic packet

Magic Packet是进行网络唤醒的数据包,将这个数据包以广播的形式发到局域网上,与数据包中所关联的MAC相同的电脑就会被唤醒开机,通常我们都是使用UDP报文的形式来发送这个数据包,但实际上在进行网络唤醒的时候,只要报文中包含Magic Packet应该就可以唤醒相关的计算机,与IP协议、UDP协议没有任何关系,本文将试图抛开网络层(IP层)和传输层(TCP/UDP层),直接在数据链路层发出Magic Packet,并成功实现网络唤醒,本文将提供完整的源代码。阅读本文需要有较好的网络编程基础。

2023-04-11 19:31:47 920

原创 如何用C语言操作arp cache

arp cache中存放着局域网内IP地址和MAC地址的对应关系,对socket通信是至关重要的,arp cache由Linux内核进行维护,本文介绍如何用ioctl获取arp cache记录,添加新记录到arp cache中,删除arp cache中记录,每一种操作均给出了完整的源程序,本文程序在ubuntu 20.4中编译运行成功,gcc版本9.4.0

2023-04-04 20:09:30 648

原创 使用C语言实现服务器/客户端的UDP通信

本文旨在使用简单的例子说明编写一个服务器/客户端模式的UDP通信程序的步骤,并通过一个实例给出了程序的基本框架,本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0,本文适合初学者阅读。

2023-03-31 10:40:40 931

原创 TCP服务器如何使用select处理多客户连接

TCP是一种面向连接的通信方式,一个TCP服务器难免会遇到同时处理多个用户的连接请求的问题,本文用一个简化的实例说明如何在一个TCP服务器程序中,使用select处理同时出现的多个客户连接,文章给出了程序源代码,本文假定读者已经具备了基本的socket编程知识,熟悉基本的服务器/客户端模型架构。

2023-03-27 10:59:50 1450

原创 使用C语言实现服务器/客户端的TCP通信

本文力求使用简单的描述说明一个服务器/客户端TCP通信的基本程序框架,文中给出了服务器端和客户端的实例源程序,本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0

2023-03-23 14:41:50 1186

原创 linux下使用netlink获取gateway的IP地址

要在linux下的程序中获取gateway的IP地址,使用netlink是一种直接、可靠的方法,不需要依赖其它命令,直接从linux内核获取信息,netlink编程的中文资料很少,本文试图用尽可能简单的方式讨论使用netlink获取gataway的IP地址的编程方法,并有大量篇幅介绍netlink的相关数据结构和编程方法,假定阅读本文的读者对linux下编程有一定了解,具备一定的C语言能力,熟悉IPv4的socket编程。

2023-03-20 11:33:09 638

原创 使用select实现的UDP/TCP组合服务器

独立的TCP服务器和UDP服务器,可以找到很多例子,但如果一个服务希望在同一个端口上及提供TCP服务,也提供UDP服务,写两个服务端显然不是一个好的办法,也不利于以后的维护,本文将把UDP服务器和TCP服务器合并成一个服务器,该服务器既可以提供UDP服务也可以提供TCP服务,本文将给出完整的源代码。

2023-03-13 16:26:09 514

原创 从proc文件系统中获取gateway的IP地址

在linux的命令行下获取当前网络环境的gateway的IP并不是一件难事,常用的命令有 ip route 或者 route -n,其实 route -n 也是通过读取proc文件系统下的文件来从内核获取路由表的,但 ip route 是通过netlink来获取的路由表;本文将讨论如何编写程序从proc文件系统中获取路由表,并从路由表中获取gateway的IP地址,文章最后给出了完整的源程序。

2023-03-07 10:43:49 613

原创 接收arp请求并发送回应的实例

本文简单介绍了arp协议,用一个实例查看收到的ARP请求,并对该请求发出ARP回应,实例有完整的源代码,使用C语言在Linux下实现,代码中有详细的注释

2023-02-27 11:44:54 808

原创 如何使用raw socket发送UDP报文

大多数的网络编程都是在应用层接收数据和发送数据的,本文介绍在数据链路层的网络编程方法,介绍如何在数据链路层直接接收从物理层发过来的原始数据数据包,文章给出了一个完整的范例程序。

2023-02-21 20:37:11 1346

原创 如何在Linux命令行下发送和接收UDP数据包

众所周知,在传输层有两个常用的协议TCP和UDP,本文介绍在Linux命令行下,如何使用nc命令发送或接收UDP数据包,这些命令的用法对调试UDP通信程序将有所帮助。

2023-02-13 21:23:17 3822

使用ioctl扫描wifi信号获取AP的essid、mac地址等属性

使用 wifi 是一件再平常不过的是事情,有很多 wifi 工具可以帮助你扫描附近的 wifi 信号,测试信号强度等,但如何通过编程来操作 wifi 却鲜有文章涉及;本文立足实践,不使用任何第三方库,仅使用 ioctl 扫描附近的 wifi 信号,并获取这些 AP 的 ESSID、MAC 地址、占用信道和工作频率,本文将给出完整的源程序,今后还会写一些文章讨论如果编程获取 wifi 信号的其它属性(比如:信号强度、加密方式等)的方法,敬请关注;本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;阅读本文并不需要对 IEEE802.11 协议有所了解。 扫描 WIFI 信号显然是要操作无线网卡才能实现,通常情况下无线网卡的驱动程序是在内核空间的,用户空间的应用程序是无法直接控制驱动程序的;为了能够从用户空间控制无线网卡的驱动程序,我们在用户空间编写的程序需要与内核进程进行通信; 实现用户进程与内核通信的方式有很多,本文采用的是 ioctl,但还有其它方式,比如 netlink 等。

2023-08-14

使用SOCK-DGRAM类型的socket实现的ping程序

SOCK_DGRAM类型的socket常用于UDP通信,本文将尝试把这种socket用于ICMP协议,并完成一个简单的ping程序。使用ping去测试某个主机是否可用可能是一件很平常的事,尽管ping非常普通,但是编写一个实现ping功能的程序却并不是那么简单,因为ping使用的ICMP协议并不是一个应用层协议,在网上看到的实现ping的例子大多使用raw socket去实现,不仅增加了解析IP报头的麻烦,而且还需要有root权限才能运行,本文简要介绍ICMP协议,并给出一个使用普通的常用于UDP通信的socket实现ping的实例,本文将提供完整的源程序,本文的程序在 Ubuntu 20.04 下测试通过,gcc 版本号 9.4.0;阅读本文需要熟悉socket编程,对初学者而言,本文有一定的难度。

2023-08-12

网络编程中如何用C语言实现的一个DNS客户端

DNS可以帮助我们把域名映射到一个IP地址上,或者查询一个IP地址下有那些域名,使用域名访问一个网站或者服务器是一件很平常的事情,很少有人关心域名变成IP地址的实际过程,本文将使用C语言实现一个基本的DNS解析器,通过与DNS服务器的通信完成将一个域名转换成IP地址的过程,本文将提供完整的源程序;阅读本文需要有一定的网络编程基础,熟悉基本的socket编程并对DNS有一些了解,本文对网络编程的初学者难度较大。 在日常的网络活动中,有时会遇到DNS污染的困扰,比如在浏览器中输入域名,却无法到达我们期望到达的网站,这有时就是因为我们收到的DNS回应并不是来自一个合法的DNS服务器;当遇到此类问题时,本文的程序可以帮助你判断是否存在DNS污染。 如果一个网站没有完成备案,则使用域名访问时也无法到达该网站,这其实也是在DNS上做的文章。

2023-08-12

网络编程中使用tun虚拟网络接口建立IP隧道的实例

通常的socket编程,面对的都是物理网卡,Linux下其实很容易创建虚拟网卡;本文简单介绍一下Linux虚拟网卡的概念,并以tun设备为例在客户端和服务器端分别建立一个实际的虚拟网卡,最终实现一个从客户端到服务器的简单的IP隧道,希望本文能对理解虚拟网卡和IP隧道有所帮助,本文将提供完整的源程序;阅读本文需要具备在Linux下使用C语言进行IPv4下socket编程的基本能力,本文对网络编程的初学者难度较大。 TUN和TAP是Linuxn内核的虚拟网络设备,不同于普通靠硬件网络适配器实现的设备,这些虚拟的网络设备全部用软件实现,并可以向运行于Linux上的应用软件提供与硬件的网络设备完全相同的功能; TUN模拟了网络层设备,操作第三层(网络层)数据包,通常我们使用的TCP/UDP报文在网络层使用的IP协议,所以使用TUN设备,需要自己构建IP报头和TCP/UDP报头; Linux通过TUN/TAP设备向绑定该设备的用户空间的应用程序发送数据;同样,用户空间的应用程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。

2023-08-11

路由表查找算法-最长前缀匹配的具体实现

在Linux操作系统中,内核中有一个路由表,它包含若干条路由记录,这些记录由子网IP、子网掩码、网关IP和接口名等组成,这些信息用于将数据包转发到其他子网或者连接到互联网;本文介绍了当需要转发数据包时,Linux内核查找路由表的基本算法,并用程序模拟了这个过程,附有完整的源代码。本文对网络编程的初学者难度不大。 当我们在Linux系统下发送一个报文时,Linux需要确定路由,也就是将这个报文转发到哪个网络接口下的哪个设备上去,一个连接在网络上的Linux系统至少有两个网络接口,一个是网卡(有线或者无线网卡),一个loopback,Linux从报文中的IP报头中获得目的IP地址,以这个目的IP地址为依据从系统内部的路由表中找到一条最适合的路由,然后将报文转发到这个路由上,在查找路由表的过程中会使用一个叫做"最长前缀匹配(Longest Prefix Match)" 的算法来确定路由;本文将简要介绍Linux系统中的路由表、路由策略以及路由决策的过程,介绍"最长前缀匹配(Longest Prefix Match)"算法,并提供一个完整的源代码来模拟这个算法在路由查找中的应用。

2023-08-11

使用SNTP协议从时间服务器同步时间

在互联网上校准时间,是几乎连接在互联网上的每台计算机都要去做的事情,而且很多是在后台完成的,并不需要人工干预;互联网上有很多时间服务器可以发布精确的时间,计算机客户端使用NTP(Network Time Protocol)协议与这些时间服务器进行时间同步,使本机得到精确时间,本文简要描述了NTP协议的原理,对NTP协议的时间同步精度做了简要分析,并具体实现了SNTP(Simple Network Time Protocol)下的客户端,本文附有完整的C语言SNTP客户端的源程序。阅读本文只需掌握基本的socket编程即可,本文对网络编程的初学者难度不大。

2023-08-10

网络编程中如何使用raw socket发送magic packet网络唤醒数据包实现远程唤醒

Magic Packet是进行网络唤醒的数据包,将这个数据包以广播的形式发到局域网上,与数据包中所关联的MAC相同的电脑就会被唤醒开机,通常我们都是使用UDP报文的形式来发送这个数据包,但实际上在进行网络唤醒的时候,只要报文中包含Magic Packet应该就可以唤醒相关的计算机,与IP协议、UDP协议没有任何关系,本文将试图抛开网络层(IP层)和传输层(TCP/UDP层),直接在数据链路层发出Magic Packet,并成功实现网络唤醒,本文将提供完整的源代码。阅读本文需要有较好的网络编程基础,本文对网络编程的初学者有一定难度。

2023-08-10

如何用C语言操作arp cache

arp cache中存放着局域网内IP地址和MAC地址的对应关系,对socket通信是至关重要的,arp cache由Linux内核进行维护,本文介绍如何用ioctl获取arp cache记录,添加新记录到arp cache中,删除arp cache中记录,每一种操作均给出了完整的源程序,本文程序在ubuntu 20.4中编译运行成功,gcc版本9.4.0,阅读本文需要有基本的socket编程和ioctl的知识,并对ARP协议有所了解,本文对网络编程的初学者难度不大。

2023-08-10

linux下使用netlink获取gateway的IP地址

要在linux下的程序中获取gateway的IP地址,使用netlink是一种直接、可靠的方法,不需要依赖其它命令,直接从linux内核获取信息,netlink编程的中文资料很少,本文试图用尽可能简单的方式讨论使用netlink获取gataway的IP地址的编程方法,并有大量篇幅介绍netlink的相关数据结构和编程方法,阅读本文需要对linux下编程有一定了解,熟悉IPv4的socket编程;本文对网络编程的初学者有较大难度。

2023-04-23

从proc文件系统中获取gateway的IP地址

在linux的命令行下获取当前网络环境的gateway的IP并不是一件难事,常用的命令有 ip route或者 route -n,route -n 是通过读取proc文件系统下的文件来从内核获取路由表的,但 ip route 是通过netlink来获取的路由表;本文将讨论如何编写程序从proc文件系统中获取路由表,并从路由表中获取gateway的IP地址,文章最后给出了完整的源程序,本文对初学者基本没有难度。

2023-04-23

接收arp请求并发送回应的实例

ARP协议在网络编程中有着重要的地位,是一个工作在数据链路层的协议,本文简单介绍了ARP协议,用一个实例查看收到的ARP请求,并对该请求发出ARP回应,实例有完整的源代码,使用C语言在Linux下实现,代码中有详细的注释;阅读本文需要有一定的网络编程基础,了解OSI的网络模型,本文对初学者有一定的难度。

2023-04-23

何使用raw socket发送UDP报文

使用raw socket发送报文比接收报文要复杂一些,因为需要在程序中构建数据链路层、网络层和传输层的报头,本文以发送UDP报文为例说明在使用raw socket时如何构建数据链路层、网络层和传输层的报头并发送报文,文中给出了完整的源程序;阅读本文需要掌握基本的IPv4下的socket编程方法,本文对初学者有一定难度。

2023-04-23

Linux下如何在数据链路层接收原始数据包

大多数的网络编程都是在应用层接收数据和发送数据的,程序员无需关注报文的各种报头,网络协议栈会解决这些问题,本文介绍在数据链路层的网络编程方法,介绍如何在数据链路层直接接收从物理层发过来的原始数据包,要得到数据,必须自己解开数据链路层、网络层和传输层的报头,文章给出了一个完整的范例程序,希望本文能帮助读者对网络通信有更深刻的理解;阅读本文需要具备基本的使用socket进行网络编程的能力。

2023-04-23

C语言获取ipv6地址的三种方法

使用通常获取ipv4的IP地址的方法是无法获取ipv6地址的,本文介绍了使用C语言获取ipv6地址的三种方法:从proc文件从系统获取ipv6地址、使用getifaddrs()函数获取ipv6地址和使用netlink获取ipv6地址,每种方法均给出了完整的源程序,本文所有实例在 ubuntu 20.04 下测试通过,gcc 版本 9.4.0;阅读本文需要有一定的网络编程基础知识和IPv6的知识。

2023-04-05

如何计算IP报头的checksum

如果你研究过TCP/IP协议,那么你肯定知道IP报头中的checksum字段,或许你还曾经为如何计算这个字段的值所困扰,本文我们将讨论checksum的概念,并详细介绍IP报头中的checksum是如何计算的;网络通信中有很多地方都需要进行checksum的计算,其算法其实是一样的,一般把这些checksum统称为Internet Checksum;本文适合初学者阅读。

2023-03-31

如何计算UDP报头的checksum

UDP报头只有4个字段,分别是:源端口号、目的端口号、报文长度和报头checksum,其中的报头checksum这个字段在IPv4中并不是强制的,但在IPv6中是强制的,本文介绍UDP报头中checksum的计算方法,并给出相应的源程序,实际上,网络通信中常用的IP报头、TCP报头和UDP报头中都有checksum,其计算方法基本一样,所以把这些检查和一般统称为Internet Checksum;本文对网络编程的初学者难度不大。

2023-03-31

如何在Linux命令行下发送和接收UDP数据包

众所周知,在传输层有两个常用的协议 TCP 和 UDP,本文介绍在 Linux 命令行下,如何使用 nc 命令发送或接收 UDP 数据包,这些命令的用法对调试 UDP 通信程序将有所帮助;本文适合初学者阅读。

2023-03-29

TCP服务器如何使用select处理多客户连接

TCP是一种面向连接的通信方式,一个TCP服务器难免会遇到同时处理多个用户的连接请求的问题,本文用一个简化的实例说明如何在一个TCP服务器程序中,使用select处理同时出现的多个客户连接,文章给出了程序源代码,阅读本文需要熟悉基本的socket编程知识,熟悉基本的服务器/客户端模型架构;本文对网络编程的初学者难度不大。

2023-03-29

使用select实现的UDP/TCP组合服务器

独立的TCP服务器和UDP服务器,可以找到很多例子,但如果一个服务希望在同一个端口上及提供TCP服务,也提供UDP服务,写两个服务端显然不是一个好的办法,也不利于以后的维护,本文将把UDP服务器和TCP服务器合并成一个服务器,该服务器既可以提供UDP服务也可以提供TCP服务,本文将给出完整的源代码;本文适合初学者阅读。

2023-03-29

使用C语言实现服务器/客户端的UDP通信

本文旨在使用简单的例子说明编写一个服务器/客户端模式的UDP通信程序的步骤,并通过一个实例给出了程序的基本框架,本文适合初学者阅读;本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0

2023-03-29

使用C语言实现服务器/客户端的TCP通信

本文力求使用简单的描述说明一个服务器/客户端TCP通信的基本程序框架,文中给出了服务器端和客户端的实例源程序,本文适合初学者阅读;本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0

2023-03-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除