摘要: TheC10Kproblem[HelpsavethebestLinuxnewssourceontheweb--subscribetoLinuxWeeklyNews!]It'stimeforwebserverstohandletenthousandclientssimultaneously,don'tyouthink?Afterall,thewebisabigplacenow.Andcomputersarebig,too.Youcanbuya1000MHzmachinewith2gigabytesofRAMandan1000Mbit/secEthernetcardfor$1200 阅读全文
posted @ 2013-10-31 15:01 老司机 阅读(1353) 评论(0) 推荐(0) 编辑
摘要: 最近看了《HTTP权威指南》和《UNP》有了写一个简单的web服务器的想法,正好这个学期没有什么课,所以就花了一个星期这样写了一个出来,鉴于本人水平有限,如果有什么设计或代码错误的,希望各位指出哈。tinyhttp web服务器的架构为epoll + 多线程 + sendfile, 本来想用线程池代替的因为每来一个连接就new一个线程这样对于OS来说负担太大,并且线程一旦过多线程切换就会花费很大代价造成性能瓶颈,但是我打算之后单独写一个线程池代码示例的说,所以这个版本就使用多线程来代替线程池了。tinyhttp暂时只支持GET和HEAD方法,支持的首部不多大概七八个吧,支持伪长连接(我觉得.. 阅读全文
posted @ 2013-10-16 10:52 老司机 阅读(6120) 评论(4) 推荐(2) 编辑
摘要: 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性。事实上,很难找到一种不支持 Sockets API 的现代语言。该 API 相当简单,但新的开发人员仍然会遇到一些常见的隐患。本文识别那些隐患并向您显示如何避开它们。隐患 1.忽略返回状态第一个隐患很明显,但它是开发新手最容易犯的一个错误。如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失。反过来,这可能传播错误,使定位问题的源头变得困难。捕获并检查每一个返回状态,而不是忽略它们。考虑清单 1 显示的例子,一个套接字 send 函数。清单 1. 忽略 API 函数 阅读全文
posted @ 2013-10-07 20:51 老司机 阅读(1012) 评论(0) 推荐(0) 编辑
摘要: 在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备;第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包,是linux为了接收高速的网络数据包而加入的,适用于告诉设备,现在大多数NIC都兼容了这个方法。 今天我的任务是扒一扒网络数据包在传统方法也就是低速路径中如何传入链路层以及如何将其发送给上层网络层的。下面先来看看这条低速路径的简略示意图: 1 //当产生硬件中断时,此中断处理例程被调用.例程确定该中断是否是由接收到的分组引发的,如果是则调用net_rx 2 static irqreturn_... 阅读全文
posted @ 2013-10-05 23:30 老司机 阅读(1826) 评论(0) 推荐(0) 编辑
摘要: 最近研究了linux内核的网络子系统上的网络分组的接收与发送的流程,发现这个叫sk_buff的东西无处不在,内核利用了这个结构来管理分组,在各个层中传递这个结构,因此sk_buff可以说是linux内核网络子系统的基石,所以我决定在这篇文章中好好扒一扒这个sk_buff。 下面列出我我认为比较重要的sk_buff中的成员变量: 内核是利用一个双链表来管理sk_buff的,不过不使用内核的标准双链表而是自己实现了双链表:struct sk_buff *next; struct sk_buff *prev;struct sock *sk是sk_buff关联的socketktime_t t... 阅读全文
posted @ 2013-10-04 11:44 老司机 阅读(2703) 评论(0) 推荐(4) 编辑
摘要: 最近导师要求我和另一个同学开发一个手机上课签到应用,我负责客户端和服务器之间的通信架构编写和数据的存储本人大学四年只用过汇编和C/C++,因此对andriod开发还是一窍不通,花了一个星期写出来了基本的通信功能首先是服务器端的架构:在网络通信上主要有三类网络通信线程,一是定时多播线程将同一局域网内的教师机ip广播给所有学生机,由于一个AP支持的连接数不多,所以才使用定时多播。二是监听线程,接受学生机的tcp连接然后new出签到事务线程。三是事务线程,处理学生的签到信息和返回签到状态,数据库使用andriod自带的Sqlite,由于会有大量事务线程,因此要做好线程同步问题。 1 //主线程主要代 阅读全文
posted @ 2013-09-13 14:37 老司机 阅读(1725) 评论(8) 推荐(2) 编辑
摘要: $ sudo apt-get install build-essential安装OpenGL Library接下来要把我们会用到的 Library 装上去,首先安装 OpenGL Library$sudo apt-get install libgl1-mesa-dev安装OpenGL UtilitiesOpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。接下来我们安装OpenGL Utilities$sudo apt-get install libglu1-mesa-dev安装OpenGL Ut 阅读全文
posted @ 2013-09-06 09:52 老司机 阅读(517) 评论(0) 推荐(0) 编辑
摘要: 1 #ifndef _SEG_TREE_H_ 2 #define _SEG_TREE_H_ 3 4 #include 5 #include 6 #include 7 #include 8 9 typedef struct seg_node10 {11 int left, right;12 int mid;13 int cover;//the segment is weather existed14 /* some useful data*/15 /* ....... */16 seg_node():left(0),right(0),... 阅读全文
posted @ 2013-08-28 11:53 老司机 阅读(259) 评论(2) 推荐(0) 编辑
摘要: 1 /* 2 *题目:输入一个已经按升序排序过的数组和一个数字, 3 *在数组中查找两个数,使得它们的和正好是输入的那个数字。 4 *要求时间复杂度是 O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 5 *例如输入数组 1、2、4、7、11、15 和数字 15。由于 4+11=15,因此输出 4 和 11。 6 */ 7 #include 8 #include 9 #include 10 using namespace std;11 12 pair > find_pair(int *array, int len, int x)13 {14 assert(array... 阅读全文
posted @ 2013-08-26 10:38 老司机 阅读(562) 评论(0) 推荐(0) 编辑
摘要: 1 /* 2 设计包含 min 函数的栈(栈) 3 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。 4 要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。 5 */ 6 #include 7 #include 8 #include 9 10 template class Stack11 {12 public:13 void push(const T& t);14 void pop();15 T top() const;16 T min() const;17 18 private:19 std::stack... 阅读全文
posted @ 2013-08-26 10:35 老司机 阅读(254) 评论(0) 推荐(0) 编辑