2017年12月15日

如何编写一个稳定的网络程序(TCP)

摘要: 本节我们看一下怎样才能编写一个基于TCP稳定的客户端或者服务器程序,主要以试验抓包的方式观察数据包的变化,对网络中出现的多种情况进行分析,分析网络程序中常用的技术及它们出现的原因,在之后的编程中能早一点意识到这些潜在问题。实例代码如下: client.c 和server.c 因在试验过程中代码有所改阅读全文

posted @ 2017-12-15 11:51 沐浴凌风 阅读(818) 评论(4) 编辑

2017年12月13日

Linux 编程--三种常用的定时器

摘要: 这节我们来探讨一下linux开发过程中常用的定时器,尤其在网络编程中被常常用到如heartbeat,断线重连等等。这里提供了三种定时器的方案,分别是链表形式的计时器,环型计时器,最小堆计时器。每个都有不同的作用和优势,可以结合实际项目选择或者改良。 链表计时器: 链表计时器是一个实现很简单的一种计时阅读全文

posted @ 2017-12-13 11:04 沐浴凌风 阅读(315) 评论(2) 编辑

2017年12月11日

Libevent 事件循环(2)---事件被加入激活队列

摘要: 由Libevent 事件循环(1) 在上文中我们提到了libevent 事件循环event_dispatch 的大致过程,以epoll为例,我们看一下事件被如何加入激活队列。 再看函数event_active_nolock_(ev, ev->ev_events & events, 1)。 我们在ti阅读全文

posted @ 2017-12-11 10:49 沐浴凌风 阅读(36) 评论(0) 编辑

2017年12月7日

Linux 链接详解----动态链接库

摘要: 静态库的缺点: 动态库: 是一个目标文件,包含代码和数据,它可以在程序运行时动态的加载并链接。修改动态库不需要重新编译目标文件,只需要更新动态库即可。动态库还可以同时被多个进程使用。在linux下生成动态库 gcc -c a.c -fPIC -o a.o gcc -shared -fPIC a.o 阅读全文

posted @ 2017-12-07 16:38 沐浴凌风 阅读(245) 评论(2) 编辑

2017年12月5日

Libevent 事件循环(1)

摘要: 以 epoll 模型的dispatch 看一下evsel->dispatch(base, tv_p); 再看一下timeout_process.阅读全文

posted @ 2017-12-05 17:04 沐浴凌风 阅读(42) 评论(0) 编辑

Linux 链接详解----静态链接实例分析

摘要: 由Linux链接详解(1)中我们简单的分析了静态库的引用解析和重定位的内容, 下面我们结合实例来看一下静态链接重定位过程。 实例中使用了如上代码, 在a.c 中是我们的入口函数main 和定义的全局变量a,其中引用了函数add 它的定义在b.c中。在b.c中又引用了a.c中a的定义。我们先将其分别编阅读全文

posted @ 2017-12-05 13:02 沐浴凌风 阅读(13) 评论(0) 编辑

2017年12月4日

Libevent 事件管理和添加事件

摘要: /** 我们先来看一下事件的创建*/struct event * event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg) { struct event *ev; ev = mm_mall...阅读全文

posted @ 2017-12-04 17:44 沐浴凌风 阅读(8) 评论(0) 编辑

2017年11月17日

Linux 链接详解(2)

摘要: 可执行文件加载执行过程: 上一节我们说到ELF文件格式,静态库的符号解析和重定位的内容。这一节我们来分析一下可执行文件。 由上一节我们知道可执行文件也是ELF文件,当程序被加载器加载到内存时是按照ELF格式去解析,然后把可执行文件的不同节加载到虚拟地址空间中。我们看一下32位下的进程虚拟地址模型: 阅读全文

posted @ 2017-11-17 12:39 沐浴凌风 阅读(27) 评论(0) 编辑

2017年11月16日

Linux 链接详解(1)

摘要: 可执行文件的生成过程: hello.c 预处理 > hello.i 编译 > hello.s 汇编 > hello.o 链接 >hello 加载 >hello进程 其中预处理器根据hello.c中的#开头的命令解析, 如将include 头文件放在此处,选择条件编译等等; 编译阶段 就是将.i 文件阅读全文

posted @ 2017-11-16 14:43 沐浴凌风 阅读(52) 评论(0) 编辑

2017年11月9日

Libevent 反应堆的初始化

摘要: // 默认情况下new eventbase struct event_base * event_base_new(void) { struct event_base *base = NULL; //初始化系统配置 struct event_config *cfg = event_config_new(); // 使用默认的配置方法 if (cfg) { ...阅读全文

posted @ 2017-11-09 16:38 沐浴凌风 阅读(33) 评论(0) 编辑

导航