
网络编程
文章平均质量分 96
这个专栏中的绝大多数文章中都会附有完整的、可编译运行的源代码,该专栏主要讨论在Linux下的socket编程,有基本的socket编程文章,有讨论raw socket编程的文章,有在应用层编程的文章,也有一些面向数据链路层的编程文章;部分文章涉及IPv6和netlink。该专栏将持续更新。
whowin
85年底开始接触IBM PC,进入这个行业,至今已37年余,现已退休;有记忆接触过的计算机系统有:PDP-11、VAX II、IBM PC/XT, PC/AT、PC-9801、APPLE II等;使用过的操作系统有:DOS、OS/2、UNIX、VMS、Linux、iRMX等;使用过的编程语言:BASIC、X86汇编、PASCAL、C、C++、PL/M、Perl、PHP、JAVA等;职业生涯的最后20年主要从事嵌入式开发;曾在军队服役13年,从事计算机软件工作,曾获军队科技成果二等奖;1986-1987曾赴云南参战;退役中国陆军少校。
展开
-
Linux下使用libiw进行无线信号扫描的实例
打开电脑连接wifi是一件很平常的事情,但这些事情通常都是操作系统下的wifi管理程序替我们完成的,如何在程序中扫描wifi信号其实资料并不多,前面已经有两篇文章介绍了如何使用ioctl()扫描wifi信号,但其实在Linux下有一个简单的库对这些ioctl()的操作进行了封装,这个库就是libiw,使用libiw可以简化编程,本文介绍了如果使用libiw对wifi信号进行扫描的基本方法,本文将给出完整的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0原创 2024-07-07 02:12:00 · 473 阅读 · 0 评论 -
libiw中的函数说明
打开电脑连接wifi是一件很平常的事情,但这些事情通常都是操作系统下的wifi管理程序替我们完成的,如何在程序中连接指定的wifi其实很少有资料介绍,在网络专栏的文章中,有两篇是关于wfi编程的文章,其中对无线网卡的操作都是通过ioctl()完成的,显得有些繁琐和晦涩,但其实WE(Wireless Extensions)有一个简单的库libiw,这个库的实现也是使用ioctl(),但是经过封装后,会使wifi编程变得容易一些,本文为一篇资料类的文章,主要描述libiw中API的调用方法。原创 2024-07-05 21:01:54 · 360 阅读 · 0 评论 -
使用ioctl扫描wifi信号获取信号属性的实例(二)
使用工具软件扫描wifi信号是一件很平常的事情,在知晓wifi密码的前提下,通常我们会尽可能地连接信号质量比较好的wifi信号,但是如何通过编程来扫描wifi信号并获得这些信号的属性(比如信号强度等),却鲜有文章提及,本文在前面博文的基础上通过实例向读者介绍如何通过编程扫描wifi信号,并获得信号的一系列的属性,本文给出了完整的源代码,本文程序在ubuntu 20.04下编译测试完成;阅读本文并不需要对IEEE802.11协议有所了解,本文实例中大量涉及链表和指针,所以本文可能不适合初学者阅读。原创 2024-04-13 11:42:19 · 573 阅读 · 0 评论 -
使用epoll()进行socket编程处理多客户连接的TCP服务器实例
在网络编程中,当需要使用单线程处理多客户端的连接时,常使用select()或者poll()来处理,但是当并发数量非常大时,select()和poll()的性能并不好,epoll()的性能大大好于select()和poll(),在编写大并发的服务器软件时,epoll()应该是首选的方案,本文介绍epoll()在网络编程中的使用方法,本文提供了一个具体的实例,并附有完整的源代码。原创 2024-03-12 10:50:29 · 444 阅读 · 0 评论 -
使用poll()代替select()处理多客户连接的TCP服务器实例
在网络编程中,使用select()处理多客户端的连接是非常常用的方法,select()是一个非常古老的方法,在大量连接下会显得效率不高,而且其对描述符的数值还有一些限制,Linux内核从2.1.13版以后提供了poll()替代select(),本文介绍poll()在网络编程中的使用方法,并着重介绍poll()在编程行与select()的区别,旨在帮助熟悉select()编程的程序员可以很容易地使用poll()编程,本文提供了一个具体的实例,并附有完整的源代码,本文实例在 ubuntu20.04下编译测试通过原创 2024-03-04 16:20:48 · 302 阅读 · 0 评论 -
使用signal中止阻塞的socket函数的应用实例
在 socket 编程中,有一些函数是阻塞的,为了使程序高效运行,有一些办法可以把这些阻塞函数变成非阻塞的,本文介绍一种使用定时器信号中断阻塞函数的方法,同时介绍了一些信号处理和定时器设置的编程方法,本文附有完整实例的源代码,本文实例在 Ubuntu 20.04 上编译测试通过,gcc版本号为:9.4.0;本文不适合 Linux 编程的初学者阅读。原创 2024-01-28 07:08:16 · 171 阅读 · 0 评论 -
使用ioctl扫描wifi信号获取信号属性的实例(一)
使用 wifi 是一件再平常不过的是事情,有很多 wifi 工具可以帮助你扫描附近的 wifi 信号,测试信号强度等,但如何通过编程来操作 wifi 却鲜有文章涉及;本文立足实践,不使用任何第三方库,仅使用 ioctl 扫描附近的 wifi 信号,并获取这些 AP 的 ESSID、MAC 地址、占用信道和工作频率,本文将给出完整的源程序,今后还会写一些文章讨论如果编程获取 wifi 信号的其它属性(比如:信号强度、加密方式等)的方法,敬请关注;本文程序在 ubuntu 20.04 下编译测试完成,gcc 版原创 2023-07-02 19:53:44 · 1645 阅读 · 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 · 1501 阅读 · 0 评论 -
用C语言实现的一个DNS客户端
DNS可以帮助我们把域名映射到一个IP地址上,或者查询一个IP地址下有那些域名,使用域名访问一个网站或者服务器是一件很平常的事情,很少有人关心域名变成IP地址的实际过程,本文将使用C语言实现一个基本的DNS解析器,通过与DNS服务器的通信完成将一个域名转换成IP地址的过程,本文将提供完整的源程序;阅读本文需要有一定的网络编程基础,熟悉基本的socket编程并对DNS有一些了解,本文对网络编程的初学者难度较大。原创 2023-04-24 22:40:05 · 1283 阅读 · 0 评论 -
使用tun虚拟网络接口建立IP隧道的实例
通常的socket编程,面对的都是物理网卡,Linux下其实很容易创建虚拟网卡;本文简单介绍一下Linux虚拟网卡的概念,并以tun设备为例在客户端和服务器端分别建立一个实际的虚拟网卡,最终实现一个从客户端到服务器的简单的IP隧道,希望本文能对理解虚拟网卡和IP隧道有所帮助,本文将提供完整的源程序;阅读本文需要具备在Linux下使用C语言进行IPv4下socket编程的基本能力,本文对网络编程的初学者难度较大。原创 2023-04-21 10:49:01 · 1179 阅读 · 0 评论 -
使用SNTP协议从时间服务器同步时间
在互联网上校准时间,是每台联网计算机都要去做的事情,而且很多是在后台完成的,并不需要人工干预;互联网上有很多时间服务器可以发布精确的时间,计算机客户端使用NTP(Network Time Protocol)协议与这些时间服务器进行时间同步,使本机得到精确时间,本文简要描述了NTP协议的原理,对NTP协议的时间同步精度做了简要分析,并具体实现了SNTP下的客户端,本文附有完整的C语言SNTP客户端的源程序。阅读本文只需掌握基本的socket编程即可,本文对网络编程的初学者难度不大。原创 2023-04-18 10:57:34 · 3492 阅读 · 0 评论 -
简单的路由表查找程序
在Linux操作系统中,内核中有一个路由表,它包含若干条路由记录,这些记录由子网IP、子网掩码、网关IP和接口名等组成,这些信息用于将数据包转发到其他子网或者连接到互联网;本文介绍了当需要转发数据包时,Linux内核查找路由表的基本算法,并用程序模拟了这个过程,附有完整的源代码。本文对网络编程的初学者难度不大。原创 2023-04-16 12:42:40 · 724 阅读 · 0 评论 -
使用raw socket发送magic packet
Magic Packet是进行网络唤醒的数据包,将这个数据包以广播的形式发到局域网上,与数据包中所关联的MAC相同的电脑就会被唤醒开机,通常我们都是使用UDP报文的形式来发送这个数据包,但实际上在进行网络唤醒的时候,只要报文中包含Magic Packet应该就可以唤醒相关的计算机,与IP协议、UDP协议没有任何关系,本文将试图抛开网络层(IP层)和传输层(TCP/UDP层),直接在数据链路层发出Magic Packet,并成功实现网络唤醒,本文将提供完整的源代码。阅读本文需要有较好的网络编程基础。原创 2023-04-11 19:31:47 · 1181 阅读 · 0 评论 -
如何用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 · 800 阅读 · 0 评论 -
使用C语言实现服务器/客户端的UDP通信
本文旨在使用简单的例子说明编写一个服务器/客户端模式的UDP通信程序的步骤,并通过一个实例给出了程序的基本框架,本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0,本文适合初学者阅读。原创 2023-03-31 10:40:40 · 1313 阅读 · 0 评论 -
使用C语言实现服务器/客户端的TCP通信
本文力求使用简单的描述说明一个服务器/客户端TCP通信的基本程序框架,文中给出了服务器端和客户端的实例源程序,本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0原创 2023-03-23 14:41:50 · 1553 阅读 · 0 评论 -
TCP服务器如何使用select处理多客户连接
TCP是一种面向连接的通信方式,一个TCP服务器难免会遇到同时处理多个用户的连接请求的问题,本文用一个简化的实例说明如何在一个TCP服务器程序中,使用select处理同时出现的多个客户连接,文章给出了程序源代码,本文假定读者已经具备了基本的socket编程知识,熟悉基本的服务器/客户端模型架构。原创 2023-03-27 10:59:50 · 1729 阅读 · 0 评论 -
使用select实现的UDP/TCP组合服务器
独立的TCP服务器和UDP服务器,可以找到很多例子,但如果一个服务希望在同一个端口上及提供TCP服务,也提供UDP服务,写两个服务端显然不是一个好的办法,也不利于以后的维护,本文将把UDP服务器和TCP服务器合并成一个服务器,该服务器既可以提供UDP服务也可以提供TCP服务,本文将给出完整的源代码。原创 2023-03-13 16:26:09 · 716 阅读 · 0 评论 -
linux下使用netlink获取gateway的IP地址
要在linux下的程序中获取gateway的IP地址,使用netlink是一种直接、可靠的方法,不需要依赖其它命令,直接从linux内核获取信息,netlink编程的中文资料很少,本文试图用尽可能简单的方式讨论使用netlink获取gataway的IP地址的编程方法,并有大量篇幅介绍netlink的相关数据结构和编程方法,假定阅读本文的读者对linux下编程有一定了解,具备一定的C语言能力,熟悉IPv4的socket编程。原创 2023-03-20 11:33:09 · 833 阅读 · 0 评论 -
从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 · 794 阅读 · 0 评论 -
接收arp请求并发送回应的实例
本文简单介绍了arp协议,用一个实例查看收到的ARP请求,并对该请求发出ARP回应,实例有完整的源代码,使用C语言在Linux下实现,代码中有详细的注释原创 2023-02-27 11:44:54 · 1024 阅读 · 0 评论 -
如何使用raw socket发送UDP报文
大多数的网络编程都是在应用层接收数据和发送数据的,本文介绍在数据链路层的网络编程方法,介绍如何在数据链路层直接接收从物理层发过来的原始数据数据包,文章给出了一个完整的范例程序。原创 2023-02-21 20:37:11 · 1625 阅读 · 0 评论 -
如何在Linux命令行下发送和接收UDP数据包
众所周知,在传输层有两个常用的协议TCP和UDP,本文介绍在Linux命令行下,如何使用nc命令发送或接收UDP数据包,这些命令的用法对调试UDP通信程序将有所帮助。原创 2023-02-13 21:23:17 · 4357 阅读 · 0 评论 -
如何计算IP报头的checksum
如果你研究过TCP/IP协议,那么你肯定知道IP报头中的checksum字段,或许你还曾经为如何计算这个字段的值所困扰,本文我们将讨论checksum的概念,并详细介绍IP报头中的checksum是如何计算的。原创 2023-02-08 14:14:18 · 2316 阅读 · 0 评论 -
如何计算UDP头的checksum
UDP报头只有4个字段,分别是:源端口号、目的端口号、报文长度和报头checksum,其中的报头checksum这个字段在IPv4中并不是强制的,但在IPv6中是强制的,本文介绍UDP报头中checksum的计算方法,并给出相应的源程序,实际上,网络通信中常用的IP报头、TCP报头和UDP报头中都有checksum,其计算方法基本一样,所以把这些检查和一般统称为Internet Checksum。原创 2023-02-02 11:03:17 · 2660 阅读 · 0 评论 -
Linux下如何在数据链路层接收原始数据包
大多数的网络编程都是在应用层接收数据和发送数据的,本文介绍在数据链路层的网络编程方法,介绍如何在数据链路层直接接收从物理层发过来的原始数据数据包,文章给出了一个完整的范例程序。原创 2023-01-26 16:38:23 · 1083 阅读 · 2 评论 -
C语言如何获取ipv6地址
使用通常获取ipv4的IP地址的方法是无法获取ipv6地址的,本文介绍了使用C语言获取ipv6地址的三种方法,每种方法均给出了完整的源程序,本文所有实例在 ubuntu 20.04 下测试通过,gcc 版本 9.4.0。原创 2023-01-26 16:30:05 · 5989 阅读 · 0 评论