用C#(C++)Socket后台编写自己的IIS服务器代替IIS

 本文触及到Socket TCP/IP编程方面的知识,其实这是很简单的内容,大家看不明的地方大可以先往下读,以后再看一遍,可能会觉得很简单。

很多人写网站用惯了IIS和Tomcat这些高级的后台来做网站后台服务,然而,在这些后台还没有问世之前,人们是怎么编写网站的呢?他们底层共同遵守的准则和标准又是什么呢?

这就是http协议和html、js、css标准。这些都是国际统一的标准,和.net、java、php这些语言完全没有关系的。比例如下面一段代码:

<html>

<body>

<form runat="server" id="form1">

<%

string str_response="hello world";

........................................

Response.Write(str_response);

%>

<asp:Button ID="bn_1" runat="Server" Text="点击"/>

</form>

</body>

</html>

长长的一段代码最终会被解析成下面这样

<html>

<body>

<form id="form1" action="">

hello world

<input type="submit" value="点击"  name="bn_1"/>

</form>

</body>

</html>

IIS帮助我们,将<%%>里面的内容转化成要输出的内容,同时将<asp:这些标签,转化为相应的标签(这里是<input>标签),这些在html里面是非标准的标签,属于iis规定的标签,iis有这个责任去将这些标签转化为标准的标签返回给客户。


上面这些是基础,相信很多编写过网站的人都知道是怎么一回事,下面回到正题。

下面这段代码可能大家就很少接触了:

GET /siteserver/mypage.youlike?h_username=myname HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152;

.NET CLR 3.5.30729)
Host: 127.0.0.1:45632
Content-Length: 93
Connection: Keep-Alive
Cache-Control: no-cache

其实这很简单,这就是客户端IE打开一个网址http://127.0.0.1:45632/siteserver/mypage.youlike?h_username=mynamehttp://127.0.0.1:45632这个网站的后台收到的全部协议代码。

这些字符串用换行符相隔。
其中127.0.0.1:45632是一个标准的站点的地址,127.0.0.1是IP,45632是服务端监听的端口。
User-Agent后面的是浏览器信息,GET和HTTP/1.1中间的/siteserver/mypage.youlike 是要访问的目标地址,当然,假如是自己写的后台,这个目标地址其实是一个索引,比如index.aspx,告诉服务器他想要什么数据,mypage.youlike可能真的存在这个文件,也可能这只是服务端定义的一个索引,服务的swich语句判断是mypage.youlike,那么就返回相应的数据。
当然了,/siteserver/mypage.youlike后面紧跟的就是get的参数信息的,相信编写web的朋友们肯定很清楚。


好了,上面是get的例子,那假如对方是post过来的呢?其实也很简单,只是后面加了一串东西:


POST /siteserver/mypage.youlike?h_username=myname HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152;

.NET CLR 3.5.30729)
Host: 127.0.0.1:45632
Content-Length: 93
Connection: Keep-Alive
Cache-Control: no-cache

page=12&title_id=300


服务端收到这些数据后,会做什么操作呢?

其实上面提到的是一个request请求的过程,也就是服务端接收的过程,服务端的另一个过程叫返回,也就是response的响应过程,下面我们要做什么呢?

我给一个代码大家参考一下吧:

        if(str_request_file=="/siteserver/mypage.youlike")
       {
                string send_msg = "<!DOCTYPE HTML PUBLIC /" -//W3C//DTD HTML 4.0 Transitional//EN/">";
                send_msg += "<html  xmlns=/"http://www.w3.org/1999/xhtml/">";
                send_msg += "<head><meta http-equiv=/"content-type/" content=/"text/html; charset=gb2312/"/><title>广业 IIS Server</title></head><body>";
                send_msg += "<form action=/"http://127.0.0.1/siteserver/gps.aspx/" method=/"post/" id=/"f1/" name=/"f1/">";
                send_msg += "Hello World";
                send_msg += "<input id=/"h_my_username/" name=/"h_my_username/" type=/"hidden/" value=/"nl000/" />";
                send_msg += "</form>";
                send_msg += "<script type=/"text/javascript/">";
                //send_msg += "document.getElementById(/"f1/").submit();";
                send_msg += "</script>";
///根据page=12&title_id=300,h_username=myname这些参数读取数据库,生成一些内容加进send_msg里
                send_msg += "</body>";
                send_msg += "</html>";
                byte []msg=System.Text.Encoding.GetEncoding("gb2312").GetBytes(send_msg);

                string str_senddd="HTTP/1.1 200 OK/r/nVia: 1.1 GY-14SWFMJH7AP2/r/nConnection: Keep-Alive/r/nProxy-Connection: Keep-Alive/r/nContent-Length: "+msg.Length.ToString()+"/r/nContent-Type: text/html/r/nServer: GYXX/1.0/r/nCache-Control: private/r/n/r/n";
                sendtoclient(sock, str_senddd + send_msg);


          }


sendtoclient这个方法在这里是向socket写进str_senddd + send_msg这个字符串


其实最简单的iis服务就是这样一个一读一写的过程,http的协议离不开这个过程,入门看这个,造化看个人。

联系方式:QQ:13896398,电话:13437839547

猜你喜欢

转载自blog.csdn.net/handsome0916/article/details/4581503
今日推荐