首先,如果你还不了解什么是带外数据:点这里 心跳机制的产生就是为了检测出对端主机或到对端的通信路径是否过早失效。 注意:在使用心跳机制时,你应该考虑是不是符合你所处的情景,确定在对端应答的时间超过 5~10s 之后终止连接是件好事还是坏事。如果你的产品需要实时的知道对端的“生存状态”,(要么是为了需求,要么是为了节省资源)那么就是需要这种机制的。一般用于 长连接 。    在这里,我们使用TCP的带外数据来完成心跳机制的实现(每秒钟轮询一次,若5秒没有得到响应就认为对端已经“死亡”),实现如下所示 : 客户端每隔1秒钟向服务器发送一个带外字节,服务器收到该类型的字节然后再发送回一个带外字节。因为每一端都需要对端不复存在或者不再可达。需要指出的是:**数据,回送数据和带外字节都通过单个的连接交换的 。**代码实现如下,具体实现细节在代码中有注释指出 Recvline 函数 #include "../myhead.h" static int recv_cnt = 0; static char 继续阅读 >>


刘生玺 18/09/23 15:31:39
ArchLinux 安装及KDE桌面环境安装配置 首先,安装之前,需要一个“启动介质”,我这里习惯使用USB设备作为启动介质,这是由于ArchLinux滚动更新的特性,而且占用空间很小,以其他的方式安装个人认为不太适合。 话不多说,访问ArchLinux官方网站,点击右上角Download,在下方选择适合你的下载方式或镜像进行下载,我常用的地址是网易的镜像源,和清华大学的镜像源。下载完毕后,我一般使用开源工具Rufus将之写入到U盘中。 安装 将启动U盘插入到电脑中,选择从U盘启动,进入到archlinux的LiveCD模式,若使用网线连接,此时应已经自动配置好网络,可使用ping命令测试网络;若使用无线网络,则键入wifi-menu命令选择并登录无线网络。然后,输入以下命令保证系统时间是正确的: timedatectl set-ntp true 然后我们可以通过fdisk -l命令查看分区情况,若要在此时修改分区表,ArchLinux提供了命令parted和fdisk,可以在此时修改分区表。若要格式 继续阅读 >>


娄泽豪 18/09/22 22:22:39
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可 继续阅读 >>


刘生玺 18/09/18 17:21:48
为什么需要线程池 在生产环境中,我们不能无限制的创建线程,主要原因如下: 线程创建与销毁的代价并不低; 如果可运行的线程数量多于可用处理器的数量,有些线程将会闲置,大量闲置的线程会消耗系统资源(内存)并给垃圾收集器带来压力; 大量线程竞争CPU也会造成不小的性能开销。 Executor框架 Executor框架在Java 5中被引入,其内部使用了线程池机制。它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 Executor框架包括:线程池,Executor,Executors,ExecutorService等(Callable与Future本篇不进行讨论)。 Executor接口 我们先来了解一下其中的Executor接口: public interface Executor { void execute(Runnable command); } Executor接口的定义非常简单,但它却为灵活 继续阅读 >>


董恒毅 18/09/13 21:38:05
   首先给出OSI 参考模型与TCP/IP协议模型图: 1. 概述: 首先,我们需要知道的是数据分为两种,一种是带内数据,一种是带外数据。带内数据就是我们平常传输或者说是口头叫的数据。带外数据就是我们接下来讲的内容。    许多的传输层都具有带外数据(也称为 经加速数据 )的概念,想法就是连接的某段发生了重要的事情,希望迅速的通知给对端。这里的迅速是指这种通知应该在已经排队了的带内数据之前发送。也就是说,带外数据拥有更高的优先级。带外数据不要求再启动一个连接进行传输,而是使用已有的连接进行传输。    其中,UDP没有实现带外数据(是个极端哦~)    TCP中telnet,rlogin,ftp等应用(除了这样的远程非活跃应用之外,几乎很少有使用到带外数据的地方) 2. TCP 带外数据 2.0 铺垫 : 我们亲爱的 TCP 就位于传输层,下面还有互联网层(主要是IP)与网卡等 。相信学过网络编程的都知道,对于报文的处理,在经过每一层时都会有添加头部和解析头部的操作。 继续阅读 >>


刘生玺 18/09/13 17:36:24
1.非阻塞Connect有什么用? 可以让三路握手的处理等同与一般数据的处理,而不是一直让 connect一直尝试重连或者花费一个RTT时间。而且RTT时间从几毫秒到几秒不等,万一有许多连接,不论是尝试重连还是花费一个RTT时间,都将是致命的延时。 可以使用该技术同时建立多个连接。Web浏览器中常用。 既然使用select等待连接的建立,我们就可以质地不嗯一个时间限制,使得我们能够缩短connect的超时。 2.必须去处理的细节: 处理connect立即建立的情况。(比如我们连接的是同一个主机时) 使用selcet与非阻塞connect的一些注意事项: 2.1. 当连接成功建立后,描述符变为可写。 2.2 当遇到错误时,描述符变为即可写又可读。 3. 两个例子: (1)非阻塞connect:时间获取客户程序 int Connect_nonblock(int sockfd, const SA *saptr, socklen_t salen, int nsec) / 继续阅读 >>


刘生玺 18/09/08 23:33:35
三次握手过程中 TCP 的状态变化 三次握手的过程和本质 三种状态 socket 函数 listen 函数 connect 函数 accept 函数 值-结果参数 connect 函数在三次握手中的返回情况 总结一下近日所学的关于 TCP 建立连接 三次握手 的过程中, TCP 的 状态变化, 以及在这个过程中所用的 socket 函数, 对于各种情况会如何处理 涉及到 connect listen accept 函数 三次握手过程中 TCP 的状态变化 三次握手的过程和本质 如下图, 是一个 TCP 建立和断开连接的过程, 我们今天只讨论建立连接的三次握手过程 主动申请连接的一方(通常为客户端), 发送一个 SYN 报文段, 服务器在收到客户端发来的 SYN 报文段后, 回复一个 SYN 报文段, 并发送一个 ACK 以确认客户端的 SYN, 为了确认服务器的 SYN, 客户端也会回复一个 ACK 经 继续阅读 >>


吕子健 18/09/04 14:58:46
Xv 6 Chapter 0 Operating system interfaces 操作系统的工作是分享电脑资源给多个程序,并且提供一系列服务而不是只让硬件提供。 操作系统通过接口给用户程序提供服务,所以设计一个好的接口就显得很重要。 这里操作系统xv6提供基础的接口,由Ken Thompson 和Dennis Ritchie的操作系统介绍,同时还有模仿Unix的内部设计。 每一个运行的程序叫做进程,他们都有自己的空间,其中包括指令,数据和栈。指令实现了程序的计算功能,数据是那些计算中的变量。而栈则决定了程序的运行。 当一个进程需要请求内核指令的时候,他会在操作系统的接口中请求一个程序。这样的程序叫做系统调用。系统调用进入到内核,内核就提供服务并且返回。因此一个进程在用户内存和内核内存中互相切换。 内核使用CPU的硬件保护机制来保证每个进程在用户内存中运行并只能访问自己的空间。内核运行的时候利用硬件提供的特权来实现这些保护,同时用户程序没有这些优先权。当一个用户程序请求系统调 继续阅读 >>


陈苏扬 18/08/28 15:50:27
本文所有源码来自 JDK 1.8.0_181 HashMap简介 Map是Key-Value对映射的抽象接口,Map用于保存具有映射关系的数据。Map集合里有两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。key不允许重复,key和value之间存在单向一对一关系,通过key能找到相应的value。 HashMap是基于哈希表的Map接口的实现,以Key-Value的形式存在,即存储的对象是Entry(同时包含了Key和Value)。在HashMap中,根据hash算法来计算key-value的存储位置并进行快速存取。最多只允许一条Entry的键为Null,但允许多条Entry的值为Null。此外,HashMap是线程不安全的。 结构示意 当链表达到一定长度时会进行树化。 理想状态下哈希表的每个箱子中,元素的数量遵守泊松分布: 当负载因子为 0.75 时,上述公式中 λ 约等于 0.5,因此箱 继续阅读 >>


李猛 18/08/24 15:25:44
   最近学弟学妹们在写聊天室,期间遇到了很多问题,也“逼迫”我们这些大二(其实即将大三)狗考虑了许多以前没有考虑过的东西。现在就着我们小组的聊天室的项目,送给学弟学妹们”几个可能安全的封装函数。“ frist : 保证发送“len”字节到套接字 ssize_t Sendlen(int fd, const void *buf, size_t len, int flags) { ssize_t n = 0; size_t sum = 0; const char *ptr; ptr = (const char *)buf; while (sum < len) { n = send(fd, (void *)ptr, len - sum, flags); if (n < 0) { if (errno == EINTR) n = 0; 继续阅读 >>


刘生玺 18/08/23 16:45:01