📄 一个多线程web服务器实例(c,linux,详细的web服务器原理) - 马牛不是人 - csdnblog.htm
字号:
href="<A
href='http://blog.csdn.net/manio/archive/2006/10/14/"<a'>http://blog.csdn.net/manio/archive/2006/10/14/"<a</A>">退出</a></font></div><img
src="/intl/zh-CN_ALL/images/logo.gif" width=286 height=110
alt="Google"><br><br><BR><form action=/search
name=f><script><!--<BR>function qs(el) {if (window.RegExp
&& window.encodeURIComponent) {var ue=el.href;var
qe=encodeURIComponent(document.f.q.value);if(ue.indexOf("q=")!=-1){el.href=ue.replace(new
RegExp("q=[^&$]*"),"q="+qe);}else{el.href=ue+"&q="+qe;}}return
1;}<BR>// --><BR>..........</P></DIV>
<P>第一个空行上面的就是“说明”了,下面是html代码。有了说明,浏览器就知道这是什么了,拿到这段数据后,就把这些html标签解释成各种各样的元素,在浏览器上有序地显示出来。浏览器还蛮聪明的,当看到<img
src=..>标签,那就会又自己发一个请求报文给服务器,要求得到一个图像文件,请求报文就像:</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: #000000">GET </SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">image</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">pp.jpg HTTP</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">1.1</SPAN><SPAN
style="COLOR: #000000"><BR>....</SPAN></DIV></DIV>
<P>这样,服务器端就找到这个.jpg图像,加上"说明"之后发给浏览器,浏览器收到后就显示在对应的位置上。遇到包含css、js...的标签也一样。</P>
<P>如此重复,一个完整的web就会呈现在我们眼前了。</P>
<P>服务器端代码:</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">/*</SPAN><SPAN
style="COLOR: #008000">****************************************************************<BR><BR> mymultiwebserver.c <BR><BR> system:redhat linux Fedora Core 5<BR><BR> enviroment:g++<BR><BR> compile command:g++ -g -o mymultiwebserver -lpthread<BR><BR> date:10/15/2006<BR><BR> By Manio<BR><BR> ****************************************************************</SPAN><SPAN
style="COLOR: #008000">*/</SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">stdlib.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">sys</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">types.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">sys</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">socket.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">sys</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">stat.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">netinet</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN
style="COLOR: #000000">.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">unistd.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">pthread.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">stdio.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #0000ff">string</SPAN><SPAN
style="COLOR: #000000">.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR>#include </SPAN><SPAN
style="COLOR: #000000"><</SPAN><SPAN
style="COLOR: #000000">arpa</SPAN><SPAN
style="COLOR: #000000">/</SPAN><SPAN
style="COLOR: #000000">inet.h</SPAN><SPAN
style="COLOR: #000000">></SPAN><SPAN
style="COLOR: #000000"><BR><BR><BR><BR></SPAN><SPAN
style="COLOR: #0000ff">#define</SPAN><SPAN
style="COLOR: #000000"> PORT 8848</SPAN><SPAN
style="COLOR: #000000"><BR><BR></SPAN><SPAN
style="COLOR: #0000ff">#define</SPAN><SPAN
style="COLOR: #000000"> BACKLOG 5</SPAN><SPAN
style="COLOR: #000000"><BR><BR></SPAN><SPAN
style="COLOR: #0000ff">#define</SPAN><SPAN
style="COLOR: #000000"> MAXDATASIZE 1000</SPAN><SPAN
style="COLOR: #000000"><BR><BR></SPAN><SPAN
style="COLOR: #0000ff">#define</SPAN><SPAN
style="COLOR: #000000"> DEBUG 1</SPAN><SPAN
style="COLOR: #000000"><BR><BR></SPAN><SPAN
style="COLOR: #0000ff">void</SPAN><SPAN
style="COLOR: #000000"> process_cli(</SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> connectfd, sockaddr_in client);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> sendobj(</SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> connectfd,</SPAN><SPAN
style="COLOR: #0000ff">char</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> serverfilepath);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> IsDIR(</SPAN><SPAN
style="COLOR: #0000ff">char</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> fpath);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> fileordirExist(</SPAN><SPAN
style="COLOR: #0000ff">char</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> fpath);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">char</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> getextname(</SPAN><SPAN
style="COLOR: #0000ff">char</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000">);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> writehead(FILE</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> cfp, </SPAN><SPAN
style="COLOR: #0000ff">char</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> extname);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">void</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> start_routine(</SPAN><SPAN
style="COLOR: #0000ff">void</SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000"> arg);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">void</SPAN><SPAN
style="COLOR: #000000"> msg404(</SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> connectfd);<BR><BR><BR><BR></SPAN><SPAN
style="COLOR: #0000ff">struct</SPAN><SPAN
style="COLOR: #000000"> ARG {<BR><BR> </SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> connfd;<BR><BR> sockaddr_in client;<BR><BR> };<BR><BR> <BR><BR>main()<BR><BR>{<BR><BR> </SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> listenfd, connectfd;<BR><BR> pthread_t thread; </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">id of thread</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"><BR> ARG </SPAN><SPAN
style="COLOR: #000000">*</SPAN><SPAN
style="COLOR: #000000">arg; </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">pass this var to the thread</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"><BR> </SPAN><SPAN
style="COLOR: #0000ff">struct</SPAN><SPAN
style="COLOR: #000000"> sockaddr_in server; </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">server's address info</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"><BR> </SPAN><SPAN
style="COLOR: #0000ff">struct</SPAN><SPAN
style="COLOR: #000000"> sockaddr_in client; </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">client's</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"><BR> </SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> sin_size;<BR><BR> <BR><BR> </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">create tcp socket</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"><BR>#ifdef DEBUG<BR><BR> printf(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">socket....
</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR><BR></SPAN><SPAN
style="COLOR: #0000ff">#endif</SPAN><SPAN
style="COLOR: #000000"><BR><BR> </SPAN><SPAN
style="COLOR: #0000ff">if</SPAN><SPAN
style="COLOR: #000000"> ((listenfd </SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN
style="COLOR: #000000"> socket(AF_INET, SOCK_STREAM, </SPAN><SPAN
style="COLOR: #000000">0</SPAN><SPAN
style="COLOR: #000000">)) </SPAN><SPAN
style="COLOR: #000000">==</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN
style="COLOR: #000000">) {<BR><BR> perror(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">creating socket failed.</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -