开学前两周硬件实验,虽说是硬件,但软件的味道算更浓些。选了个题目——嵌入式linux简单Web服务器,算是很经典的了,源码什么的都有,只是一直想学学网络编程。之前学MFC的简单接触了些,简单的层面上说是没多少区别的了。至于嵌入式板接触不少了,就相当于linux下c编程,只是编译器用得没有vs爽~ 用eclipse写的,linux更懒开了,开也不开真机的,而是虚拟机(实盘安装,虚拟真机都可双开),后来觉得慢干脆在Windows装了个cywin,移植了上来~直接在Windows编了,更爽了~~ 总之不是不喜欢linux,只是linux少了很多常用的东西,只拿来编程就太枯燥了.
恩,说说主题吧,好像跑题了,汗啊……源码仿造了经典例子httpd写的,算是国人改的吧。那源码问题不是没有……内存泄漏什么的,有点汗,不过03年挺古老的现在还有那么大的参考价值也算不错了~
重写一下,不过挺懒,ctrl+c, ctrl+v多。还参照网上的多路复用改了一下,改成多路复用的了。传说可以并发?不过好像改了没多大效果?或许是概念不清,多路复用原理没理解很清楚。
问题如下:
用自写的暴力访问器来访问,新accept的client socket都是同一个值,不知道为什么。按理说不应该的呀。这样就有不是并发的感觉了,因为每次请求都是被处理完了的才到下一个,没有体现得并发性。除非因为本地访问是太快了,导致这样。但是慢的又不好测试,总不能让我把一个网页做成好几十M的吧?…
不过也发现可能是另一个原因,每一次新accept的client socket只请求一个文件,那么,而多路复用是以传送单个文件完毕来作为轮换指标的,这样一次轮换就处理完了一个socket。而一个网页上有多个文件(图片、html等),这样就可以轮流处理请求?这才是多路复用的本质思想?我倒是没注意到不同机子访问时有没有在请求文件时是轮流处理的。但如果真这样用不用多路复用不是一样的吗?我直接一个while(1)得了。
另外一个想不通的问题是,阻塞传输是什么时候被阻塞的? accept时? TCP协议下对client socket写东西时,调用写文件函数都是立即返回的吗?不然多路复用的核心函数select怎么能去收集这些信息?——如果是对client socket写东西时是处理完了程序才继续执行,那么select还有它的“判断IO写入完成才返回”功效? 早都写完了…更更不解的地方是,如果在select之前,socket的IO写入就完成了,那么它还会在FD_SET里吗? select好像很神奇的样子,《linux函数大全》居然没有写清楚…都意识流的…网上也是,关于多路复用的代码怎么样都有,天花乱坠的,我是昏花了……
好了,不说了,代码如下,希望熟悉多路复用的大侠能给我解惑一下(关于多路复用的代码在WaitForRequest()里)~不胜感谢……