📄 一个多线程web服务器实例(c,linux,详细的web服务器原理) - 马牛不是人 - csdnblog.htm
字号:
href="http://blog.csdn.net/manio/category/245307.aspx">Programing</A><A
href="http://blog.csdn.net/manio/category/245307.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/manio/category/167996.aspx">Web</A><A
href="http://blog.csdn.net/manio/category/167996.aspx/rss">(RSS)</A></LI></UL>
<H3 class=listtitle>收藏</H3>
<UL class=list></UL>
<H3 class=listtitle>相册</H3><!--category title-->
<UL class=list>
<LI class=listitem><A
href="http://blog.csdn.net/manio/Gallery/174493.aspx">Just For
Looking</A></LI></UL>
<H3 class=listtitle>Linux</H3>
<UL class=list>
<LI class=listitem><A href="http://www.chinaunix.net/"
target=_blank>ChinaUnix</A>
<LI class=listitem><A
href="http://www-128.ibm.com/developerworks/cn/linux/" target=_blank>IBM
Linux</A>
<LI class=listitem><A href="http://www.kernelnewbies.org/"
target=_blank>KernelNewBies</A>
<LI class=listitem><A href="http://www.die.net/doc/linux/man/"
target=_blank>Linux man page</A>
<LI class=listitem><A href="http://www.linuxforum.net/"
target=_blank>LinuxForum</A>
<LI class=listitem><A href="http://blog.csdn.net/group/lmr/"
target=_blank>LinuxMR圈子</A>
<LI class=listitem><A href="http://www.linuxsir.org/"
target=_blank>LinuxSir</A>
<LI class=listitem><A href="http://net.pku.edu.cn/~yhf/linux_c/"
target=_blank>Linux常用C函数(中文版)</A>
<LI class=listitem><A href="http://www.chinalinuxpub.com/"
target=_self>Linux技术中坚站</A>
<LI class=listitem><A href="http://www.imhaha.com/"
target=_blank>WebQQ(IMhaha)</A>
<LI class=listitem><A href="http://www.linuxfans.org/nuke/index.php"
target=_blank>中国linux公社</A>
<LI class=listitem><A href="http://linux.ccidnet.com/"
target=_blank>赛迪网Linux</A></LI></UL>
<H3 class=listtitle>Other</H3>
<UL class=list>
<LI class=listitem><A href="http://www.sooweb.net/"
target=_blank>几维下载</A>
<LI class=listitem><A href="http://www.365key.com/manio/"
target=_blank>我的365key</A>
<LI class=listitem><A href="http://www.52z.com/"
target=_blank>飞翔下载</A></LI></UL>
<H3 class=listtitle>Sign of Success</H3>
<UL class=list>
<LI class=listitem><A href="http://donaldtrump.trumpuniversity.com/"
target=_blank>Donald Trump</A>
<LI class=listitem><A href="http://www.kaifulee.com/"
target=_blank>Kaifu Lee</A>
<LI class=listitem><A href="http://www.forbes.com/billionaires/"
target=_blank>World's Richest People</A></LI></UL>
<H3 class=listtitle>友·情</H3>
<UL class=list>
<LI class=listitem><A href="http://www.blogcn.com/user19/7bu/index.html"
target=_blank>7步的blog</A>
<LI class=listitem><A href="http://mrpirnce.blogdriver.com/"
target=_blank>Mr.Prince3.0的blog</A>
<LI class=listitem><A href="http://www.paule.net.cn/"
target=_blank>http://www.paule.net.cn/</A>
<LI class=listitem><A href="http://www.eviloctal.com/weblog"
target=_blank>冰血封情的断弦寒香阁</A>
<LI class=listitem><A href="http://spaces.msn.com/prajnalin/"
target=_blank>纸老虎-Prajna的MsnSpace</A></LI></UL>
<H3 class=listtitle>存档</H3>
<UL class=list>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/08.aspx">2007年08月(1)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/07.aspx">2007年07月(2)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/06.aspx">2007年06月(2)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/04.aspx">2007年04月(2)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/03.aspx">2007年03月(1)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/02.aspx">2007年02月(2)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2007/01.aspx">2007年01月(1)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/11.aspx">2006年11月(8)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/10.aspx">2006年10月(23)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/09.aspx">2006年09月(5)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/08.aspx">2006年08月(15)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/07.aspx">2006年07月(5)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/04.aspx">2006年04月(1)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/03.aspx">2006年03月(14)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/02.aspx">2006年02月(22)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2006/01.aspx">2006年01月(45)</A>
<LI><A
href="http://blog.csdn.net/manio/archive/2005/12.aspx">2005年12月(15)</A></LI></UL><SPAN
id=Anthem_RecentComments1_ltlComments__><SPAN
id=RecentComments1_ltlComments>
<H3 class=listtitle>最近评论</H3>
<UL class=list>
<LI class=listitem>crazyman33:<A title=点击查看《回复:如何在一个月内完成一个USB设备》
href="http://blog.csdn.net/manio/archive/2007/01/18/1487007.aspx#650488">你的1、2点全是错误的!别误人子弟</A>
<LI class=listitem>彬:<A title=点击查看《回复:什么叫精通C/C++(CSDN回帖语录)》
href="http://blog.csdn.net/manio/archive/2006/10/10/1328506.aspx#557141">写的好
我很想学习这 但现在连入门的c语言都不熟悉<BR>请问我能继续学下去吗?????</A>
<LI class=listitem>shootyou:<A
title=点击查看《回复:谨以此文献给才毕业2--5年的朋友(其实应该给还在大学中的朋友)》
href="http://blog.csdn.net/manio/archive/2006/10/18/1339502.aspx#522523">好东西~
看了有丝感动~</A>
<LI class=listitem>boygod:<A
title=点击查看《回复:谨以此文献给才毕业2--5年的朋友(其实应该给还在大学中的朋友)》
href="http://blog.csdn.net/manio/archive/2006/10/18/1339502.aspx#505090">有种说不出的感觉,就总是形容不出来</A>
<LI class=listitem>zippo:<A title=点击查看《回复:聆听朱清时教授讲创新》
href="http://blog.csdn.net/manio/archive/2006/07/07/887150.aspx#482497">在我们收到订单后3个工作日内,我们会电话通知您取货时间,办公室地址:湖南省长沙市芙蓉中路119号标志房产大厦12B08,电话:0731-2891329
0731-2891129</A></LI></UL></SPAN></SPAN></DIV></FONT></FONT></TD>
<TD class=MainCell>
<DIV id=main>
<DIV class=Tag>
<SCRIPT language=javascript
src="一个多线程web服务器实例(C,Linux,详细的web服务器原理) - 马牛不是人 - CSDNBlog.files/urltag.aspx"></SCRIPT>
<DIV style="CLEAR: both"></DIV></DIV><SPAN class=PreAndNext
id=viewpost.ascx_PreviousAndNextEntriesUp>
<DIV align=center><A
href="http://blog.csdn.net/manio/archive/2006/10/17/1338512.aspx">上一篇: what
kind of linuxer is wanted by companys?</A> | <A
href="http://blog.csdn.net/manio/archive/2006/10/13/1333470.aspx">下一篇: 入门多线程服务器程序实例</A></DIV></SPAN><BR>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>
<DIV class=post>
<DIV class=postTitle><A
href="http://blog.csdn.net/manio/archive/2006/10/14/1334558.aspx"><IMG
height=13
src="一个多线程web服务器实例(C,Linux,详细的web服务器原理) - 马牛不是人 - CSDNBlog.files/authorship.gif"
width=15 border=0> 一个多线程web服务器实例(C,Linux,详细的web服务器原理)</A> </DIV>
<DIV class=postText>
<P>系统:fedora core
5<BR>编译器:g++<BR>实现功能:通过http协议,用浏览器查看服务器上的html,htm,jpg,jpeg,gif,png,css文件 ,或者说查看带有jpg,jpeg,gif等文件的网页,即是web~<BR>把代码复制下来到linux里,照着后面的方法编译、运行,就可以看到一个简单的多线程服务器的效果了。</P>
<P>原理:<BR>在浏览器中输入一个网址,回车之后,浏览器会向相应主机的相应端口发送一段报文,如果是http协议的(如平常看到的网页的传输协议),就会发送HTTP请求报文。下面是一个报文的例子:</P>
<DIV
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #008000">GET /index.html HTTP/1.1<BR>Host:
127.0.0.1:8848<BR>User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN;
rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1
pango-text<BR>Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5<BR>Accept-Language:
zh-cn,zh;q=0.5<BR>Accept-Encoding: gzip,deflate<BR>Accept-Charset:
gb2312,utf-8;q=0.7,*;q=0.7<BR>Keep-Alive: 300<BR>Connection:
keep-alive</SPAN></DIV></DIV>
<P>我们在服务器端把收到的数据打印出来,可以看到浏览器发过来的就是这个东西。当然,也可以用ethereal等抓包工具来抓获这些报文。关于报文里写的是什么意思,网上有很多资料的,GOOGLE一下就有了。我们只看第一行。</P>
<P>GET表示是要从服务器获取文件,/index.html是文件的路径,这个路径是相对于服务器端程序所在文件夹的路径。如我的服务器端程序放在/home/mio/program/webserver1707/里面,那这个index.html在服务器上的绝对路径就是/home/mio/program/webserver1707/index.html。如果报文里是GET
/admin/login.html
HTTP/1.1的话,那么login.html文件在服务器端的路径是/home/mio/program/webserver1707/admin/login.html.HTTP/1.1表示的是HTTP协议的版本是1.1.</P>
<P>服务器端程序运行后,一直监听8848端品(0-1023的端口由IANA统一分配和控制的,不要用,最好选大一些的端口号。我原来用了个1234,用不了,还是选大一点好,可以用5460之类的啊~:)
),当监听到客户端发来的请求后,就与客户端建立链接,接收客户端发过来的请求报文。我们如果把这些报文打出来,就可以看到就是与上面请求报文类似的东西了。</P>
<P>下面我们要根据所接受的到的请求报文(<SPAN style="COLOR: #008000">GET /index.html
HTTP/1.1</SPAN>)来决定放给客户端(即浏览器)什么东西。这里我们看到浏览器要的是index.html这样一个html文本,我们就在相应路径(/home/mio/program/webserver1707/index.html)找到这个文件,不过不要急着发给客户端,我们要先告诉客户端,发过去的是一个html文件,让浏览器做好相应的准备。怎么让浏览器知道呢?我们还是用报文,这个报文叫响应报文。报文由状态行、首部行、实体主体三部分组成。状态行只有一行,它和首部行、首部行的每行之间是没有空行的,但是首部行与实体主体之间有一个空行,表明从这个空行开始,就是你浏览器要的数据了。下面是一个用ethereal抓到的响应报文: </P>
<DIV
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<P>HTTP/1.1 200 OK<BR>Cache-Control: private<BR>Content-Type: text/html;
charset=UTF-8<BR>Content-Encoding: gzip<BR>Server:
GWS/2.1<BR>Content-Length: 1851<BR>Date: Sat, 14 Oct 2006 11:33:39 GMT</P>
<P><html><head><meta http-equiv="content-type"
content="text/html;
charset=UTF-8"><title>Google</title><style><!--<BR>body,td,a,p,.h{font-family:arial,sans-serif}<BR>.h{font-size:20px}<BR>.q{color:#00c}<BR>--></style><BR><script><BR><!--<BR>function
sf(){document.f.q.focus();}<BR>function
clk(url,oi,cad,ct,cd,sg){if(document.images){var e =
window.encodeURIComponent ? encodeURIComponent : escape;var u="";var
oi_param="";var cad_param="";if (url)
u="&url="+e(url.replace(/#.*/,"")).replace(/\+/g,"%2B");if (oi)
oi_param="&oi="+e(oi);if (cad) cad_param="&cad="+e(cad);new
Image().src="/url?sa=T"+oi_param+cad_param+"&ct="+e(ct)+"&cd="+e(cd)+u+"&ei=E8swRYIOkpKwAvzZ8JkB"+sg;}return
true;}<BR>// --><BR></script><BR></head><body
bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000
onLoad=sf() topmargin=3 marginheight=3><center><div
align=right nowrap style="padding-bottom:4px" width=100%><font
size=-1><b>manioster@gmail.com</b>&nbsp;|&nbsp;<a
href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Dzh-CN&sig=__1eXNMn0jGllmJ57x74DzjVvy6Vk="
onmousedown="return
clk('/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Dzh-CN&sig=__1eXNMn0jGllmJ57x74DzjVvy6Vk=','promos','hppphou:zh-cn_all','pro','1','&sig2=zclmOmtQiZPPuTCMWUJMZA')">个性化主页</a>&nbsp;|&nbsp;<a
href="<A
href="https://www.google.com/accounts/ManageAccount">https://www.google.com/accounts/ManageAccount</A>">我的帐户</a>&nbsp;|&nbsp;<a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -