上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 24 下一页

2018年2月26日

套接字I/O超时设置方法和用select实现超时

摘要: 注:如无特殊说明,sockfd 原始状态都是阻塞的。 一、使用alarm 函数设置超时 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 void handler(int sig) { } signal(SIGALRM, handler); alarm(5); int r 阅读全文

posted @ 2018-02-26 14:16 AlanTu 阅读(987) 评论(0) 推荐(0) 编辑

shutdown 与 close 函数 的区别

摘要: 假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 阅读全文

posted @ 2018-02-26 14:13 AlanTu 阅读(285) 评论(0) 推荐(0) 编辑

使用select函数改进客户端/服务器端程序

摘要: 一、当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出现一个有趣的现象,先来看输出: 先运行服务器端,再运行客户端, simba@ubuntu:~/Documents/code/linux_programming/UNP/socket 阅读全文

posted @ 2018-02-26 14:11 AlanTu 阅读(1441) 评论(0) 推荐(0) 编辑

五种I/O模型和select函数简介

摘要: 一、五种I/O模型 1、阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提供的buf),然后recv返回,进行数据处理。 2、非阻塞I/O 我们可以使用 fcntl(fd, 阅读全文

posted @ 2018-02-26 14:08 AlanTu 阅读(913) 评论(0) 推荐(0) 编辑

一个进程发起多个连接和gethostbyname等函数

摘要: 一、在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就可以让一个客户端发起多个连 接,然后只利用其中一个连接发送数据。 先来认识一个函数getsockname #include <sys/socket.h> int getsockname(int 阅读全文

posted @ 2018-02-26 14:05 AlanTu 阅读(588) 评论(0) 推荐(0) 编辑

利用recv和readn函数实现readline函数

摘要: 在前面的文章中,我们为了避免粘包问题,实现了一个readn函数读取固定字节的数据。如果应用层协议的各字段长度固定,用readn来读是非常方便 的。例如设计一种客户端上传文件的协议,规定前12字节表示文件名,超过12字节的文件名截断,不足12字节的文件名用'\0'补齐,从第13字节开始是 文件内容,上 阅读全文

posted @ 2018-02-26 14:03 AlanTu 阅读(942) 评论(1) 推荐(2) 编辑

tcp流协议产生的粘包问题和解决方案

摘要: 我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议 阅读全文

posted @ 2018-02-26 14:01 AlanTu 阅读(873) 评论(0) 推荐(0) 编辑

使用fork并发处理多个client的请求和对等通信p2p

摘要: 一、在前面讲过的回射客户/服务器程序中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就f 阅读全文

posted @ 2018-02-26 13:59 AlanTu 阅读(716) 评论(0) 推荐(0) 编辑

最简单的回射客户/服务器程序、time_wait 状态

摘要: 下面通过最简单的客户端/服务器程序的实例来学习socket API。 echoser.c 程序的功能是从客户端读取字符然后直接回射回去。 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 阅读全文

posted @ 2018-02-26 13:56 AlanTu 阅读(387) 评论(0) 推荐(0) 编辑

C/S程序的一般流程和基本socket函数

摘要: 一、基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服 阅读全文

posted @ 2018-02-26 13:54 AlanTu 阅读(997) 评论(0) 推荐(0) 编辑

socket概述和字节序、地址转换函数

摘要: 一、什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口。 socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIX Domain So 阅读全文

posted @ 2018-02-26 13:53 AlanTu 阅读(1234) 评论(0) 推荐(0) 编辑

分析一帧基于UDP的TFTP协议帧

摘要: 下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度。 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00 IP首部 000 阅读全文

posted @ 2018-02-26 13:52 AlanTu 阅读(1286) 评论(0) 推荐(0) 编辑

IP数据报格式和IP地址路由

摘要: 一、IP数据报格式 IP数据报格式如下: 注:需要注意的是网络数据包以大端字节序传输,当然头部也得是大端字节序,也就是说: The most significant bit is numbered 0 at the left, and the least significant bit of a 3 阅读全文

posted @ 2018-02-26 13:49 AlanTu 阅读(3187) 评论(0) 推荐(0) 编辑

利用ARP和ICMP协议解释ping命令

摘要: 一、MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)。如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentat 阅读全文

posted @ 2018-02-26 13:48 AlanTu 阅读(5942) 评论(0) 推荐(0) 编辑

TCP/IP协议栈与数据报封装

摘要: 一、ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardization)国际标准化组织定义的网络分层模型,共七层,如下图。 物理层(Physical Laye 阅读全文

posted @ 2018-02-26 13:46 AlanTu 阅读(3075) 评论(0) 推荐(0) 编辑

从汇编角度来理解linux下多层函数调用堆栈运行状态

摘要: 我们用下面的C代码来研究函数调用的过程。 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int bar(int c, int d) { int e = c + d; return e; }int foo(int a, int b) { return  阅读全文

posted @ 2018-02-26 13:36 AlanTu 阅读(540) 评论(0) 推荐(0) 编辑

read/write函数与(非)阻塞I/O的概念

摘要: 一、read/write 函数 read函数从打开的设备或文件中读取数据。 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件 阅读全文

posted @ 2018-02-26 13:34 AlanTu 阅读(5078) 评论(0) 推荐(0) 编辑

可重入函数、线程安全、volatile

摘要: 一、 POSIX 中对可重入和线程安全这两个概念的定义: Reentrant Function:A function whose effect, when called by two or more threads,is guaranteed to be as if the threads each 阅读全文

posted @ 2018-02-26 13:32 AlanTu 阅读(316) 评论(0) 推荐(0) 编辑

Linux进程地址空间和虚拟内存

摘要: 一、虚拟内存 先来看一张图(来自《Linux内核完全剖析》),如下: 分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL就会与段的特权级进行比 阅读全文

posted @ 2018-02-26 13:30 AlanTu 阅读(2391) 评论(0) 推荐(0) 编辑

C 标准库IO缓冲区和内核缓冲区的区别

摘要: 1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开、读、写和关闭,使用的函数接口是相同的。用户程序调用C标准I/O库函数读写 阅读全文

posted @ 2018-02-26 13:28 AlanTu 阅读(2200) 评论(1) 推荐(1) 编辑

文件描述符file descriptor与inode的相关知识

摘要: 每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process Control Block)。task_struct中有一个指针(struct files_str 阅读全文

posted @ 2018-02-26 13:26 AlanTu 阅读(633) 评论(0) 推荐(0) 编辑

C 标准IO 库函数与Unbuffered IO函数

摘要: 先来看看C标准I/O库函数是如何用系统调用实现的。 fopen(3) 调用open(2)打开指定的文件,返回一个文件描述符(就是一个int 类型的编号),分配一 个FILE 结构体, 通常里面包含了: 文件fd 缓冲区指针 缓冲区长度 当前缓冲区读取长度 出错标志 返回这 个FILE 结构体的地址。 阅读全文

posted @ 2018-02-26 13:25 AlanTu 阅读(414) 评论(0) 推荐(0) 编辑

计算机体系结构一点基础知识

摘要: 下面这张图来自《深入理解计算机系统》: IO桥部分一般还分为北桥和南桥,北桥当然是靠上的了。 •CPU –主频: CPU的时钟频率,内核工作的时钟频率 –外频: 系统总线的工作频率 –倍频: CPU外频与主频相差的倍数 –前端总线: 将CPU连接到北桥芯片的总线 –总线频率: 与外频相同或者是外频的 阅读全文

posted @ 2018-02-26 13:24 AlanTu 阅读(1203) 评论(0) 推荐(1) 编辑

套接字socket 的地址族和类型、工作原理、创建过程

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 11:01 AlanTu 阅读(1901) 评论(0) 推荐(0) 编辑

Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 11:00 AlanTu 阅读(1052) 评论(0) 推荐(0) 编辑

内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:58 AlanTu 阅读(1586) 评论(0) 推荐(0) 编辑

X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:56 AlanTu 阅读(1320) 评论(0) 推荐(0) 编辑

进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:53 AlanTu 阅读(1431) 评论(0) 推荐(0) 编辑

时间系统、进程的调度与切换

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:50 AlanTu 阅读(2822) 评论(0) 推荐(0) 编辑

进程控制块PCB结构 task_struct 描述

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:49 AlanTu 阅读(1257) 评论(0) 推荐(0) 编辑

中断机制和中断描述符表、中断和异常的处理

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:47 AlanTu 阅读(1572) 评论(0) 推荐(0) 编辑

80386的分段机制、分页机制和物理地址的形成

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:46 AlanTu 阅读(876) 评论(0) 推荐(0) 编辑

80386的各种寄存器一览

摘要: 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早 阅读全文

posted @ 2018-02-26 10:42 AlanTu 阅读(2528) 评论(0) 推荐(0) 编辑

平衡二叉树AVL - 插入节点后旋转方法分析

摘要: 平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。 首先我们知道,当插入一个节点,从此插入点到树根节点路径上的所有节点的平衡都可能被打破,如何解决这个问题呢? 这里不讲大多数书上提的什么平衡因子,什 阅读全文

posted @ 2018-02-26 10:40 AlanTu 阅读(662) 评论(0) 推荐(0) 编辑

十种排序算法总结

摘要: 首先声明一下,本文只对十种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料(本人参考): 1、《data structure and algorithm analysis in c 》 2、《大话数据结构》 3、http://blog.c 阅读全文

posted @ 2018-02-26 10:38 AlanTu 阅读(433) 评论(0) 推荐(0) 编辑

散列表(四)冲突处理的方法之开地址法: 二次探测再散列的实现

摘要: 前面的文章分析了开地址法的其中一种:线性探测再散列,这篇文章来讲开地址法的第二种:二次探测再散列 (二)、二次探测再散列 为改善“堆积”问题,减少为完成搜索所需的平均探查次数,可使用二次探测法。 通过某一个散列函数对表项的关键码 x 进行计算,得到桶号,它是一个非负整数。 若设表的长度为TableS 阅读全文

posted @ 2018-02-26 10:35 AlanTu 阅读(15647) 评论(0) 推荐(0) 编辑

散列表(三)冲突处理的方法之开地址法: 线性探测再散列的实现

摘要: 二、开地址法 基本思想:当关键码key的哈希地址H0 = hash(key)出现冲突时,以H0为基础,产生另一个哈希地址H1 ,如果H1仍然冲突,再以H0 为基础,产生另一个哈希地址H2 ,…,直到找出一个不冲突的哈希地址Hi ,将相应元素存入其中。这种方法有一个通用的再散列函 数形式: 其中H0 阅读全文

posted @ 2018-02-26 10:33 AlanTu 阅读(16105) 评论(0) 推荐(0) 编辑

散列表(二)冲突处理的方法之链地址法的实现: 哈希查找

摘要: 首先需要澄清的一点是,这里讲的是hash table/hash map ,即数据项所存储的表要用数组来实现。 一、链地址法 这种基本思想:将所有哈希地址为i 的元素构成一个称为同义词链的链表,并将链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在 同义词链中进行。 该散列方法首先对关键 阅读全文

posted @ 2018-02-26 10:31 AlanTu 阅读(892) 评论(0) 推荐(0) 编辑

散列表(一)散列表概念、散列函数构造方法、常见字符串哈希函数: 测试冲突

摘要: 一、散列表基本概念 1、散列表(hash table) ,也叫哈希表,是根据关键码而直接进行访问的数据结构。也就是说,它通过把关键码映射到表中一个位置 来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 2、若结构中存在关键码为x的记录,则必定在hash(x)的存储位 阅读全文

posted @ 2018-02-26 10:30 AlanTu 阅读(1327) 评论(0) 推荐(0) 编辑

二叉排序树 - 删除节点策略及其图形化(二叉树查找)

摘要: 二叉排序树(BST,Binary Sort Tree)具有这样的性质:对于二叉树中的任意节点,如果它有左子树或右子树,则该节点的数据成员大于左子树所有节点的数据成员,且小于右子树所有节点的数据成员。排序二叉树的中序遍历结果是从小到大排列的。 二叉排序树的查找和插入比较好理解,主要来看一下删除时的情况 阅读全文

posted @ 2018-02-26 10:28 AlanTu 阅读(15602) 评论(0) 推荐(0) 编辑

上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 24 下一页

导航