自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

进击的小学生

To be or not to be, this is a question.

  • 博客(39)
  • 资源 (10)
  • 论坛 (1)
  • 收藏
  • 关注

原创 103-使用广播的 UDP 回射客户端

讲了好几篇有关广播的理论,是时候实践一下了。这一次,需要将之前写的 udp 回射服务器和客户端拿过来,稍作修改。你可以直接去 unp/program/template 这个模板文件夹下面把 udp 的代码拿过来改。本文使用的程序工具托管在 gitos 上:http://git.oschina.net/ivan_allen/unp模板路径:unp/program/template本文程序路径:un

2017-05-31 16:10:05 1036 1

原创 102-受限广播地址

这种也称之为本地广播地址,它的目标地址为 255.255.255.255. 意思是只在本网络进行广播,绝对不会被路由器转发。1. 规则如果一台主机发送的 IP 数据报目标地址为 255.255.255.255,则相当于向发送者所在的网络发送子网定向广播。路由器从不转发目的地址为 255.255.255.255 的 IP 数据报。这比子网定向广播要容易的多,我们来看下实验。2. 实验2.1 网络拓扑

2017-05-26 13:30:10 6584 4

原创 101-指向子网的广播

我们将用三个实验来观察现象。1. 实验一1.1 网络拓扑图 图1 网络拓扑 1.2 实验步骤在主机 PC1 上 ping 广播地址 192.168.1.255,并在主机 PC1 上抓包。 图2 ping 命令结果 1.2 结果分析 图3 抓包结果 我们希望回答这样一个问题:主机 PC1 自己知道这是一个广播地址吗?答:很明显,PC1 自己知道它是一个广播地址,并且还和自己在同

2017-05-25 21:06:13 2050 2

原创 100-广播

1. 引言在学习前面的 IPv4 地址的时候,你就已经注意到,有些地址被称之为广播地址(主机号全1),还有一类地址称为组播地址(D类地址)。从这一篇开始,我们需要做大量实验来学习广播。听起来很简单,但实际上没那么容易。2. 广播的基本概念按照协议层次来分第 2 层广播,即链路层广播,这种广播不会穿越路由器。因此你会经常听到,路由器隔离广播域。(交换机隔离冲突域。)第 3 层广播,也就是我们要讲的

2017-05-25 19:52:36 930 2

原创 99-IPv4 地址

很久以前我们非常简单的讨论过 《IPv4 地址》,那时候是出于网络编程基础的需要,介绍了和 IP 地址相关的函数。这一次,我们来详细的讨论下 IP 地址的结构。1. IPv4 地址分类1981 年,标准就制定了一种基本的编址方法。32 位的 IP 地址由 {netid, hostid} 两部分构成,根据这个规则,依据 netid 将 IP 地址分成 5 大类: 图1 五类 IP 地址 比如

2017-05-23 17:10:20 1329 5

原创 98-traceroute 程序

traceroute 程序可以让我们看到 IP 数据报从一台主机传到另一台主机所经过的路由,该程序最早由 Van Jacobson 实现。当然我们不可能原汁原味的模仿一遍 traceroute 程序,在这里,我们只需要把最关键的功能实现出来就算完成任务。1. 牛刀小试本文使用的程序工具托管在 gitos 上:http://git.oschina.net/ivan_allen/unp1.1 仿真环境测

2017-05-23 12:12:13 1229 2

原创 97-ICMP 协议(端口不可达)

ICMP 端口不可达是差错报文中的一种,它的类型(type)是 3,代码(code)也是 3.1. 差错报文首部格式 图1 差错报文首部 2. 实验打开我们之前写的 ICMP 报文接收程序程序托管在 gitos 上:http://git.oschina.net/ivan_allen/unp如果你已经 clone 过这个代码了,请使用 git pull 更...

2017-05-23 10:38:29 9867 2

原创 96-ICMP 协议(时间戳请求与应答)

ICMP 时间戳请求允许系统向另一个系统查询当前的时间。1. ICMP 时间戳1.1 首部格式 图1 ICMP 时间戳请求与应答报文 它的 type 字段为 17(请求)或 18(应答),code 字段为 0.发起时间戳:发送者的发送时间,由发送者填写接收时间戳:接收者的接收时间,由接收者填写发送时间戳:接收者的发送时间,由接收者填写通常,接收时间戳等于发送时间戳。可以理解为接收者接

2017-05-21 18:10:19 8801 7

原创 95-PING 命令实现

学完了 ICMP 回显请求与应答报文,就可以用它来实现我们平时使用的 PING 命令了。先来看看效果: 图1 自带的 ping 命令与我们自己实现的 1. 程序路径本文使用的程序托管在 gitos 上:http://git.oschina.net/ivan_allen/unp如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/prog

2017-05-19 14:34:14 1160 2

原创 94-ICMP 协议(回显请求与应答)

当 ICMP 首部 type = 8, code = 0,该 ICMP 是回显请求报文。当 type = 0, code = 0 时,是回显应答报文。1. 回显请求与应答报文1.1 首部格式 图1 ICMP 回显请求与应答报文首部 当 ICMP 报文是回显请求与应答报文时,我们可以看到首部的第 4、5 两个字节是标识符字段,第 6、7 两个字节是序号字段。1.2 结构体该结构体定义在 unp

2017-05-18 15:01:26 9087 6

原创 93-接收 ICMP 报文

如果你练习过前面的接收 IP 数据报的程序,相信写出这个不会很难。1. 程序路径本文使用的程序托管在 gitos 上:http://git.oschina.net/ivan_allen/unp如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/icmp/basic.2. 程序编写思路因为这一次我们只想要 ICMP 协议,因此可

2017-05-17 20:29:56 1150 5

原创 92-ICMP 协议(基础)

ICMP 协议(Internet Control Messages Protocol,网际控制报文协议)是网络层最重要的协议之一。前面的实验我们也看到了,它由 IP 协议承载,封装在 IP 协议的数据部分。 图1 ICMP 被封装在 IP 数据报的数据部分 1. ICMP 报文的作用网络上经常会出现一些错误,比如目标主机不存在,目标端口不存在什么的,那么你要怎么知道呢?ICMP 的功能之一就

2017-05-17 17:35:40 1136 2

原创 91-接收 IP 数据报

Raw Sockets,原始套接字。它出现的理由很简单,我们可以自己构造一个完整的 IP 数据报,通过原始套接字发送出去。也可以从原始套接字中读取一个完整的 IP 数据报。1. 创建原始套接字// 创建一个 IPv4 原始套接字sockfd = socket(AF_INET, SOCK_RAW, protocol); 注意:只有 root 权限的用户才能创建原始套接字第三个参数 protoc

2017-05-16 20:13:00 1054 2

原创 90-IP 协议(基础)

IP 协议是 TCP/IP 协议族中最核心的协议,TCP、UDP、ICMP 等众多协议需要依赖它工作。1. IP 首部1.1 IP 首部格式 图1 IP 首部 IP 首部相比 TCP 首部要简单的多。因为 TCP 是可靠协议,所以需要更多的字段。1.2 IP 首部结构体该结构体定义在 netinet/ip.h 中。不过为了方便学习,我将该结构体定义在了 unp/include/ip.h,写程

2017-05-16 16:04:20 1014 2

原创 89-非阻塞 accept

不知道你是否还记得异常连接—— accept 返回前连接终止。这篇文章探讨的是在 accept 函数调用前,连接被异常终止的情况。不过,很遗憾我们并未观察到 accept 产生异常。man 手册中解释,linux 会把错误转移到 accept 返回的新套接字(已连接套接字)中,因此在后续的 read 已连接套接字的时候,会产生错误。假设我考虑最坏的情况,即 accept 会产生错误,会怎样呢?1.

2017-05-14 18:17:15 941 2

原创 88-非阻塞 connect 版本的 web 客户程序

1. web 客户程序目标:1) web 客户程序建立与某个 web 服务器的 HTTP 连接,然后获取主页(这只是一个开胃菜,测试我们的 web 程序是否正常工作)。2) 同时请求多个网络资源,并下载。(看起来很像多线程爬虫,但是我们不使用多线程,而是非阻塞 connect)我们的 web 客户程序命名为就命名为 web,使用方法如下:$ ./web <同时允许最大连接数> <主页> <主页

2017-05-14 15:34:38 982 3

原创 87-非阻塞 connect

非阻塞i/o 上调用 connect 比非阻塞 i/o 上调用 read/write 要麻烦一点,一方面 connect 函数不能像 read/write 那样反复调用,它只能调用一次;另一方面,connect 函数返回错误,并不代表连接建立不成功。1. 非阻塞 connect对于 TCP 协议,在非阻塞 i/o 上调用 connect,意味着 connect 会发送 SYN 段给服务...

2017-05-12 10:33:18 858 5

原创 86-时间获取客户端

本文来一点比较轻松的话题,来写一个客户端,从时间服务器(daytime server) 上取得时间并打印。1. daytime 服务器daytime 服务器我们不用自己写了,这个网站列举了很多现成的 daytime 服务器地址:http://tf.nist.gov/tf-cgi/servers.cgi , 剩下的事情我们就只管写客户端。daytime 服务器使用的是 TCP 协议,默认端口是 13。

2017-05-10 12:40:36 771 2

原创 85-使用多线程改写回射客户端

上一篇文章中,我们已经见识了非阻塞I/O + 缓冲区改写回射客户端的复杂性。本文我们使用多线程来重写客户端,后面可以看到,这个版本要简洁的多。1. 程序路径本文使用的程序托管在 gitos 上,你可以使用下面的命令 clone 到你的电脑上:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git p

2017-05-09 10:58:32 727 2

原创 84-使用非阻塞 I/O 改写回射客户端

这个程序,应该是相当复杂的。读完它需要一些耐心,不过我会力求突显程序的结构,删除无关的代码。1. 回顾旧程序旧版本程序的结构如下:while(1) { rfds = {stdin, sockfd}; select(rfds); if (stdin in rfds) { read(stdin); // 风险代码,可能产生阻塞 writen(sockfd); }

2017-05-08 19:58:07 1058 2

原创 83-非阻塞 I/O

回顾一下上一篇文章,阻塞版本的 writen 固然好用,但是也有风险,我们不能把希望寄托在增加客户端 TCP 发送缓冲区和接收缓冲区的大小上,而是应该采取更加有保障的措施。前面说过,可以使用非阻塞 IO,也可以使用多进程或多线程。本文,我们先来讨论一下非阻塞 I/O 的特性。1. 概述可能产生阻塞的套接字调用分成四类:1) 输入操作,包括 read, readv, recv, recvfrom,

2017-05-08 16:11:35 878 3

原创 82-再议 select 版回射客户端

第一次,我们写的服务器客户端是停等版本,像下面这样:while(1) { read(stdin); writen(sockfd); read(sockfd); writen(stdout);}后来,我们用 select 改进了它:while(1) { rfds = {stdin, sockfd}; select(rfds); if (stdin in rfds) {

2017-05-08 13:46:11 846 1

原创 81-凭证的发送与接收

使用 Unix 域套接字作为辅助数据传递的另一种数据是用户凭证(user credential)。FreeBSD 使用 struct cmsgcred 结构来传递凭证,此时辅助数据的 type 类型是 SCM_CREDS.不过,我们讨论的是 Linux,不同于 FreeBSD,在 Linux 中使用 struct ucred 结构传递凭证,辅助数据的 type 类型是 SCM_CREDENTIALS

2017-05-06 15:45:22 869 1

原创 80-进程间传递描述符(策略)

万事俱备,只欠东风。现在就差如何进行程序结构设计了。我们已经知道,可以通过辅助数据传递描述符了,那么接下来怎么做?1. 目标我们的目标是让进程 fork 一个子进程,子进程继承 unix 域套接字。子进程打开某个文件,然后将该文件描述符通过 sendmsg 发送给父进程。很好,这没什么难度。程序结构大概就如下:int main() { /****************** 封装成 myOpen

2017-05-05 15:50:25 1030 2

原创 79-辅助数据

Unix 域协议这一章的第一篇文章就是讨论如何在进程间传递描述符,可是后面似乎我们把这件事忘了。其实不然,我们一直在为这件事做铺垫,本文将进一步逼近“真相”。辅助数据 (Ancillary) ,也叫控制数据,实际上在前面讲解 recvmsg 和 sendmsg 时提过一嘴,当时只是说先放一放。1. 回忆 msghdr{}还记得吧,这个结构体是 recvmsg 和 sendmsg 函数的第二个参数类型

2017-05-05 13:45:15 1292 1

原创 78-socketpair 函数

如果涉及到父子进程间的通信,我们就没有必要弄的那么麻烦,不需要再创建套接字地址,不需要绑定。函数 socketpair 会创建两个连接好的套接字。1. socketpair 函数int socketpair(int family, int protocol, int sockfd[2]);family 参数只能是 AF_LOCAL 或 AF_UNIX,protocol 只能是 0. type 参数

2017-05-05 10:59:14 1005 2

原创 77-Unix 域数据报回射服务器

同样的,这个程序根据之前的 UDP 回射服务器改写。1. 程序路径程序路径:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/unixdomainprotocols/echo_datagram.2. 伪代码服务器voi

2017-05-04 20:51:21 754 2

原创 76-抽象 unix 域套接字地址

1. 普通 VS 抽象前面我们已经学习过了 sockaddr_un 结构,它有一个成员 sun_path,通常它保存的是一个以'\0'为结尾的绝对路径。一旦绑定了一个绝对路径,就会生成一个文件。这种 unix 域套接字地址我们称为普通 unix 域套接字地址。还有一种 unix 域套接字地址,它的特征是 sun_path[0] 是 null,即 sun_path[0] == '\0'. 这种 uni

2017-05-04 19:46:35 1259 6

原创 75-Unix 域字节流回射服务器

很久以前我们早已学过各种各样的进程间通信的方法,比如无名管道,有名管道共享内存等等。而使用 unix 域协议进行通信,也是一种进程通信的方法。所以以后面试官问你进程间通信手段,不要忘记了这种^_^.知道了 unix 域的套接字地址以及绑定后,其它的和 ipv4 的操作没什么两样。1. 程序路径程序路径:git clone https://git.oschina.net/ivan_allen/unp.

2017-05-04 17:27:40 818 1

原创 74-Unix 域套接字地址结构

1. unix 域协议简介不同于 ipv4 的 AF_INET,unix 域只用于本机进程间通信,它所使用的完全是另一套协议。在使用 unix 域的时候,socket 函数的第一个参数必须指定为 AF_LOCAL 或者 AF_UNIX,表示创建一个 unix 域套接字。2. sockaddr_un {}不同于 ipv4 的 sockaddr_in{} 结构,unix 域的套接字地址结构为 socka

2017-05-04 16:44:49 900 1

原创 73-进程间传递描述符(概述)

从这一篇开始,正式进入 Unix Domain Protocols —— Unix 域协议。不过本文标题似乎与 Unix 域协议没有什么关系,实际上,它是 unix 域协议的一个应用。接下来,我们进入主题。1. 如何在进程间传递描述符早先在 Linux 环境编程中学习 fork 函数的时候,我们就知道子进程可以继承父进程所有打开的描述符,很明显,这是一种传递描述符的方式。int fd = open(

2017-05-04 14:25:14 699 1

原创 72-套接字与标准I/O

之前我们使用 read,write 及其他们的变体(recv, send) 函数读写 I/O,这些函数都是围绕着描述符工作的。我们将这一类 I/O 称为 Unix I/O.我们也可以使用标准 I/O 函数库来读写 I/O,它由 ANSI C 标准进行规范,比如 fputs, fgets 等等。当然了,fputs, fgets 这一类函数也可以用于套接字,不过这需要从描述符创建一个标准 I/O 流,主

2017-05-02 19:50:55 689 1

原创 71-recvmsg 和 sendmsg 函数

这两个函数只适用于套接字描述符。read、readv、recv 和 recvfrom 能用的地方,recvmsg 都能使用,而且,recvmsg 能提供更多的功能。同样的,各种 output 类型的函数都可以替换成 sendmsg 函数。所以,recvmsg 和 sendmsg 是之前我们学过的读写类函数的究极形态。这么强大的函数,使用起来也会相当的复杂,在本文,我们只讨论它的一部分功能,剩下的功能

2017-05-02 17:39:08 1666 7

原创 70-散布读、聚集写

看到这个标题你可能会懵圈,没事,只是名字有点恐怖而已。在英文中,它们被称为 scatter read和 gather write.1. 引例看下面一段代码:char buf1[10];char buf2[20];char buf3[15];write(fd, buf1, 10);write(fd, buf2, 20);write(fd, buf3, 15);上面这样的代码实际上很常见,不知道

2017-05-02 13:31:28 816 1

原创 69-recv 和 send 函数

recv 和 send 函数专门用于套接字描述符的,相比于 read 和 write,前三个参数一模一样。recv 和 send 只多了一个参数 —— flags.如果你还记得 recvfrom 和 sendto,你应该能回忆起它们也有一个参数 flags,那时候没有讲解这个标志位,是因为放到这篇文章一起讲了。1. recv 和 send函数原型 ssize_t recv(int sockfd

2017-05-02 10:45:03 1019 1

原创 68-套接字超时(SO_RCVTIMEO 与 SO_SNDTIMEO)

设置套接字超时的第三个技术是使用套接字选项 SO_RCVTIMEO 与 SO_SNDTIMEO,它的优势在于一次设置,所有应用于该套接字的操作都自动带有超时时间。它就好像是一个全局开关。比如对于 SO_RCVTIMEO 来说,如果设置了它,所有对该套接字的读操作在规定的时间里没完成,就直接返回并设置 errno = EWOULDBLOCK,对于 SO_SNDTIMEO 选项来说也是一样。1. 程序路

2017-05-02 10:22:23 13194 2

原创 67-套接字超时(select)

设置超时的第二个技术是使用 select 函数。它使用了 select 函数的最后一个超时参数,对套接字描述符进行了“预读”。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 Git pull 更新一下。本节程序所使用的程序路径是 unp

2017-05-02 10:06:09 907 1

原创 66-套接字超时(alarm)

我们知道,使用 read 或 recvfrom 函数从 socket 上读取数据时,可能会导致阻塞。特别是 UDP 服务器,稍有不甚,数据报就丢失就会直接导致程序假死(阻塞在 recvfrom)。还有 connect 函数,如果去连接一个网络上不存在的主机,需要等待很长时间,可能长达 2 分钟。如果我们能控制它在指定的时间内连接不上,就直接报错,行不行呢?很可惜,上面的问题 linux 并未直接提供

2017-05-02 09:47:28 858 1

原创 65-高级 I/O 函数与技术

UDP 的基础内容已经结束,但是 UDP 远远不止于此,后面还会有更多关于 UDP 更多的讨论。不过在此之前,我们还得学习更多更高级的网络编程知识。很久以前学习 Linux 环境编程时,也写过高级 I/O 相关的笔记,那时候主要讨论了三大块内容:记录锁、IO 多路复用和异步 IO. 这一次要网络编程中,我们要学习的高级 I/O 当然只是针对网络编程来说的,这次的内容包含函数和编程技巧的讲解:为 I

2017-05-02 08:57:34 726 1

EasyDraw 3.0(事故树绘制)

EasyDraw 事故树软件,3.0 版本,完全免费。排版更加精致,支持生成 svg 矢量图,png/jpeg 图形。

2018-11-02

梯度下降法VS2008_C++

梯度下降法完整的VS2008代码。博客地址:http://blog.csdn.net/q1007729991/article/details/40382071

2014-10-23

事故树绘制软件easydraw免费V2.19

免费版本的事故软件,实现所有计算功能,节点自动调整,建树判错等功能!支持导出图片。

2013-12-13

GCC 内联汇编

gcc 内联汇编 1 AT&T 与 INTEL 的汇编语言语法的区别 1.1 大小写 1.2 操作数赋值方向 1.3 前缀 1.4 间接寻址语法 1.5 后缀 1.6 指令 2 GCC 内嵌汇编 2.1 简介 2.2 内嵌汇编举例 2.3 语法 2.3.1 汇编语句模板 2.3.2 输出部分 2.3.3 输入部分 2.3.4 限制字符 2.3.5 破坏描述部分 2.4GCC 如何编译内嵌汇编代码

2018-10-28

版本控制之道-使用 Git

程序员修炼三部曲第一部,Travis Swicegood 著,董越、付昭伟等译

2018-10-28

事故树绘制分析软件

简单易用,功能其全的一个事故树绘制分析软件,用以计算最小割集,最小径集,顶上事件概率,概率重要度,结构重要度,临界重要度,计算方法可选。 计算的结果可以保存到本地txt文本文件,方便您复制到您需要的地方,给您的论文写作也会带来极大方便。概率计算提供一套精确算法,可以根据您所提供的数据计算出精确结果。当然您也可以选择近似算法,本软件提供首项近似法和平均近似法的计算结果,给您多种选则。软件非常简单易用,自己几分钟就可以学会,谢谢您的使用!

2012-12-17

增强版事故树绘制与分析程序

1.完善建立事故树的过程 2.事故树节点自动排列,免去手工排列节点的烦恼 3.编号自动生成,免去手工编号的繁琐 4.自动检测是否有闭环回路,防止用户建立逻辑上错误的事故树 5.自动检测用户是否在一个事件下重复添加 6.相同事件下建立节点,会进行同步复制,提高建树效率 7.相同事件下删除节点,会进行同步删除 8.手工拖动节点时自动对齐 9.修改节点信息,所有相同节点进行同步修改 10.画布大小自定义 11.画布颜色,事件框颜色,门颜色,文字颜色可以自定义 12.完美的一键保存bmp图片功能 13.编码树与文字树一键切换 14.列出事件清单,方便用户一次性输入事件概率 15.完善顶上事件概率计算,提供最小割集逼近法,无重复基本事件计算法,首项近似法,以及事件状态组合法。 16.优化最小割集、径集算法,提高计算速度 17.结构重要度删除不必要的状态组合法,仅提供公式三计算结果 18.提高了概率重要度、关键重要度的计算精度

2013-04-19

汇编_单片机_matlab_Multisim等

注意:此为TXT文档,里面都有下载地址,你所要下载的东东都在我的u115网盘里! 静态反汇编工具W32Dasm.rar 51单片机种子全.rar win7系统工具.rar matlab详细教程.rar Multisim教程.exe 中国象棋经典残局《适情雅趣》_0.1.exe UltraEdit-32_V16.20.0.1009_汉化版(30天免费使用).exe 精美PPT模板_2009.11.30.zip VC6.0简体中文企业版.rar

2010-11-24

MFC 音乐播放器

基本上实现了常用的播放功能,可以自动下一首,通过音量条控制音量,实现时间进度栏,实现将添加到列表的歌曲文件列表存储到本地,下次启动的时候依然还在,更多功能等待你的发觉,不要说分高,学习才是王道,尊重作者的劳动成果,花了两天时间写的。

2012-12-12

k近邻_kd-tree_kd树_vs2008_C++代码

vs2008写的Kd树泛型算法,支持k近邻查询。

2014-12-15

--Allen--的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

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

TA关注的人 TA的粉丝

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