要读懂这些代码主要是要了解ASP中操作二进制数据的对象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有这个基础,就可以进一步添加更多的功能如加入杂点,渐变底色,数字行列错位,笔画短点,提高被ocr识别的不可能。目前还没有好的识别引擎,昨天下载了个号称能识别图像验证码90%的!把4321识别成 89910,所以图像码还是比较安全的。
在网上看到有暴力破解的方法,如果我用图像附加码+禁止外部提交+10次密码错误封帐号 +50次密码错误琐死IP+10秒的防刷新间隔注册页,登陆页均要加上+禁止外部提交,这样,暴力破解应该就没戏了。
Asp文件:Code.Asp
数据文件:body.Fix , Head.Fix
用法:<img src="code.asp">
Response.buffer = true
NumCode
Function NumCode()
Response.Expires = -1
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
dim zNum,i,j
dim Ados,Ados1
Randomize timer
生成随机四位数字:
zNum = cint(8999*Rnd+1000)
传递给session
Session("GetCode") = zNum
该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换
dim zimg(3),NStr
NStr=cstr(zNum)
For i=0 to 3
zimg(i)=cint(mid(NStr,i+1,1))
Next
dim Pos
'定义二个 ADODB.Stream binary对象,作图像数据操作之用:
set Ados=Server.CreateObject("Adodb.Stream")
Ados.Mode=3
Ados.Type=1
Ados.Open
set Ados1=Server.CreateObject("Adodb.Stream")
Ados1.Mode=3
Ados1.Type=1
Ados1.Open
'载入0~9的数字数据10x100的,Gbr的阵列数据,每个320字节,10个数字3200byte
'BGR一个点,10x10个点一个数字,一个点三个字节(二进制8位,16进制 00~FF)
'一行10个点 30字节 + 行结束标记 00 00 二字节 32字节,所以一个10x100宽小于长的图像每个数字10x10是320字节
'长大于宽的则无行结束标记 0000,直接是300字节
这些就是BMP 24bit的数据详细信息了
‘至于头部,也很简单,包含长宽,图像开始标记等等~~才54字节,远没jpg什么的复杂
Ados.LoadFromFile(Server.mappath("body.Fix"))
Ados1.write Ados.read(1280)
'第一个for循环,按生成的随机数字顺序从 10X100的数字阵列中提取出相应的四个数字
但是竖排的数字阵列
for i=0 to 3
Ados.Position=(9-zimg(i))*320
Ados1.Position=i*320
Ados1.write ados.read(320)
next
'清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件
Ados.LoadFromFile(Server.mappath("head.fix"))
Pos=lenb(Ados.read())
Ados.Position=Pos '指定Pos位置,即可再偏移54字节的位置添加图形数据
第二个for循环,进行数字的阵列变换,由竖排的块转换为横排的数字块
方法是隔320字节抽取4次30字节写入ados对象,再抽取偏移第二行的图像数据
30字节是因为bmp 宽大于长时无00 00的行结束标记
for i=0 to 9 step 1
for j=0 to 3
Ados1.Position=i*32+j*320
Ados.Position=Pos+30*j+i*120
Ados.write ados1.read(30)
next
next
Ados.Position=0
response.BinaryWrite直接向客户端发送图像数据
Response.ContentType = "image/BMP"
Response.BinaryWrite Ados.read()
Ados.Close:set Ados=nothing
Ados1.Close:set Ados1=nothing
End Function
每一个程序语言或开发工具都有一定的函数与用户进行沟通,Asp同样如此。在Asp中负责将信息传递给用户的对象就是Response对象。Response对象用于动态响应客户端请求(Request),并将动态生成的响应结果返回到客户端浏览器中,使用Response对象可以直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值等等。 Response对象在asp编程中非常广泛,也是一种非常好用的工具。下面我们来具体看看Response对象:
语法:
Response.collection|property|method
一、集合
Response 对象只有一个集合 --Cookies,Cookies数据集合允许将数据设置在客户端的浏览器中。若指定的 cookie 不存在,则创建它。若存在,则自动更新数据。
语法:Response.Cookies(Cookie)[Key.Attribute]
这里的 cookie 是指定 cookie 的名称。而如果指定了 key,则该 cookie 就是一个字典。attribute 指定 cookie 自身的有关信息。attribute 参数可以是下列之一 :
Domain 只写。若被指定,则 cookie 将被发送到对该域的请求中去。
Expires 只写。指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,必须设置该日期。若此项属性的设置未超过当前日期,则在任务结束后 cookie 将到期。
HasKeys 只读。指定 cookie 是否包含关键字。
Path 只写。若被指定,则 cookie 将只发送到对该路径的请求中。如果未设置该属性,则使用应用程序的路径。
Secure 只写。指定Cookie是否安全。
示例:
<%
Response.Cookies("wrclub")("weburl")="http://www.wrclub.net"
Response.Cookies("wrclub").path="/wrclub/"
Response.Cookies("wrclub").Expires=#2003-11-30#
%>
二、方法
Response.AddHeader Name,Value
向应答中添加一个新的HTML标题。Name为新HTML标题的名称。Value为该头变量的值。你可以添加任何名称和任何值的HTML标题。它并不替代现有的同名标题。一旦标题被添加,将不能删除。
Response.AppendToLog String
向Web服务器的日志条目的末尾添加一字符串。String为要添加到日志文件中的字符串。
Response.BinaryWrite Data
该方法可以不经任何字符转换就将制定的信息写到HTTP输出,主要用于写非字符串信息(如客户端应用程序所需的二进制数据等)。Data是要发送的数据。
Response.Clear
删除缓冲区的所有HTML输出,但只删除响应正文而不删除响应标题。可以用该方法处理错误情况。需要注意的是,如果Response.Buffer设置为True,则该方法将导致运行是错误。
Response.End
强迫Web服务器停止执行更多的脚本,并发送当前结果,文件中剩余的内容将不被处理。如果Response.Buffer设置为True,则调用Response.end将缓冲输出。
Response.Flush
对于一个缓冲的回应,发送所有的缓冲信息。如果Response.Buffer设置为True,则该方法将导致运行是错误。
Response.Redirect URL
将客户端的浏览器重定向到一个新的Internet地址。Url为新网页的Internet地址。
Response.Write Variant
Response.Write是Response对象最常用的方法,该方法可以向浏览器发送字符串。Variant是一字符串或一个具有字符串值的变量。
三、属性
Response.Buffer
缓冲一Active Server Page。回应只到某一页结束或Response.Flush或Response.End方法调用时才发送出去。服务器将输出送给客户端后就不能再设置Buffer属性。
Response.CacheControl
指明是否Proxy服务器能缓存Active Server Page。缺省时,其值为FALSE 。当设置其属性为Public时,Proxy服务器可以缓冲由Asp产生的输出。
Response.CharSet(Charsetname)
将字符集名称(如GB)附加到Response对象中content-type标题的后面,用来设置web服务器响应给客户端的文件字符编码。一个可能的值为“ISO_LATIN_1”。
Response.ContentType
指明回应内容的类型。可能的值为text/plain和image/GIF,默认值text/HTML。
Response.Expires
浏览器可以缓存当前页的时间长度,以分钟为单位。
Response.ExpiresAbsolute
浏览器不能再缓存当前页的日期和时间。在未到期之前,可以返回。如果未指定时间,该主页在当天午夜到期;如果未指定日期,则到当天指定时间到期。
True/False = Response.IsClientConnected
属性为只读,指明自上次调用Response.Write之后,客户端是否仍然和服务器连接。该属性允许用户在客户端和服务器没有联接的情况下有更多的控制。例如,在从客户端提出请求起到服务器做出相应,其间要用去很长一段时间的情况下,这就可能有助于确保在继续处理脚本之前客户端仍是连通的。具有值TRUE或FALSE。
Response.PICS (PICS 字符串)
用于添加网页的PICS等级。PICS级别指明某一网页的内容级别,比如暴力或色情的程度等。
Response.Status = "状态描述字符串"
用来设置Web服务器要响应的状态行的值。
用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助
用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助
用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助
用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助
' ===================================================================
' 读取数据库中数据到数组的类
' 作者:心飞翔
' QQ:85166 E-MAIL:Apwmj@hotmail.com
' 声明:
' 如采用本类模块,请不要去掉这个说明,这段注释不会影响执行的速度.
' 各种用途均可免费使用,但是修改后必须把修改后的文件发送一份给作者.
' 2004年5月18日
' ===================================================================
DbPath = "test.mdb"'数据库位置
ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(DbPath)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open ConnStr
Class Class_Read
Public Arr,Rs,SQL,ArrTR,ArrTD,Page,TotalRead,TotalPage
Public Function Read(SQL,TD,TR,PG)
SQL = Replace(SQL,"'","")
Page= Int(PG)
Set Rs = Server.CreateObject("ADODB.Recordset") : Rs.open SQL,conn,1,1
TotalRead= Rs.RecordCount
If TotalRead>0 Then
If TR>0 Then : Rs.PageSize = TR : Else : TR=TotalRead
If TD>Rs.Fields.Count or TD<1 Then TD = Rs.Fields.Count
If TotalRead Mod TR <>0 Then TotalPage = 1 : End If : TotalPage = TotalPage + Int(TotalRead/TR)
If Page>=TotalPage Then Page=TotalPage : TR = TotalRead-TR*(TotalPage-1)
If Page>1 Then Rs.absolutePage=Page Else Page=1
End If
reDim Arr(TD-1,TR)
For ArrTR = 0 to TR-1 : If Rs.Eof Then Exit For
For ArrTD = 0 to TD-1 : Arr(ArrTD,ArrTR) = Rs(ArrTD) : Next : Rs.MoveNext
Next
ArrTR = ArrTR-1
Rs.Close
Set Rs=Nothing
End Function
End Class
'使用方法
Dim C:Set C = New Class_Read
C.Read ("SQL语句","读取列数","读取行数[既每页显示条数]","当前页数")
Dim i
For i=0 To C.ArrTR
Response.Write "<br>内容:"&C.Arr(0,i)
Next
Response.Write "<br>总记录条数:"&C.TotalRead
Response.Write "<br>总页数 :"&C.TotalPage
Response.Write "<br>当前页 :"&C.Page
Response.Write "<br>当前记录数:"&C.ArrTR+1
<%
' Moving to random record - Steven Jones' Extension
If Not(记录集名称.bof and 记录集名称.eof) Then
' reset the cursor to the beginning
If (记录集名称.CursorType > 0) Then
记录集名称.MoveFirst
Else
记录集名称.Requery
End If
记录集名称_totalrn = -1
记录集名称_totalrn = 记录集名称.RecordCount ' ony works on some recordsets, but much faster
If (记录集名称_totalrn = -1) Then ' and if it didn't work, we still have to count the records.
' count the total records by iterating through the recordset
记录集名称_totalrn=0
While (Not 记录集名称.EOF)
记录集名称_totalrn = 记录集名称_totalrn + 1
记录集名称.MoveNext
Wend
' reset the cursor to the beginning
If (记录集名称.CursorType > 0) Then
记录集名称.MoveFirst
Else
记录集名称.Requery
End If
End If
' now do final adjustments, and move to the random record
记录集名称_totalrn = 记录集名称_totalrn - 1
If 记录集名称_totalrn > 0 Then
Randomize
记录集名称.Move Int((记录集名称_totalrn + 1) * Rnd)
End If
End If
' all done; you should always check for an empty recordset before displaying data
%>
||Function TimeDiff(sBegin, sEnd)
'||本函数计算两个时间的差,可以不用更改直接使用
'||作者:machinecat 2001/10/26
'******************************
'******************************
'注:首先需要判断用户输入的sBegin与sEnd之间的大小
'可以通过DataDiff函数获得两者之间的时间差,不需要进行复杂的时间换算
'******************************
Function TimeDiff(sBegin, sEnd)
Dim iHourB, iMinuteB, iSecondB, iMiniSecondB
Dim iHourE, iMinuteE, iSecondE, iMiniSecondE
Dim dTimeB, dTimeE, dTimeDiff
Dim iHour, iMinute, iSecond, iMiniSecond
iHourB = clng(Left(sBegin, 2))
iMinuteB = clng(Mid(sBegin, 4, 2))
iSecondB = clng(Mid(sBegin, 7, 2))
iMiniSecondB = clng(Mid(sBegin, 10, 4))
iHourE = clng(Left(sEnd, 2))
iMinuteE = clng(Mid(sEnd, 4, 2))
iSecondE = clng(Mid(sEnd, 7, 2))
iMiniSecondE = clng(Mid(sEnd, 10, 4))
dTimeB = iHourB * 3600 + iMinuteB * 60 + iSecondB + iMiniSecondB / 1000
dTimeE = iHourE * 3600 + iMinuteE * 60 + iSecondE + iMiniSecondE / 1000
dTimeDiff = dTimeE - dTimeB
iHour = Int(dTimeDiff / 3600)
dTimeDiff = dTimeDiff - iHour * 3600
iMinute = Int(dTimeDiff / 60)
dTimeDiff = dTimeDiff - iMinute * 60
iSecond = Int(dTimeDiff)
dTimeDiff = dTimeDiff - Int(dTimeDiff)
iMiniSecond = dTimeDiff
TimeDiff = iHour & "小时" & iMinute & "分钟" & iSecond & FormatNumber(iMiniSecond, 3) & "秒"
End Function
<%
function URLconvert(str)
convertstr=str
urlLocation=instr(convertstr,"http://")
if (urlLocation=0) and (mailLocation=0) then
URLconvert=convertstr
exit function
end if
if urlLocation<>0 then
rightstr=str
Do while urlLocation<>urlLocationend
urlLocation=instr(rightstr,"http://")
urlLocationend=InStrRev(rightstr,"http://")
finalstr=finalstr&left(rightstr,urlLocation-1)
midurlstr=mid(rightstr,urlLocation+1,1)
do while (asc(midurlstr)>=45) and (asc(midurlstr)<=126)
loopint=loopint+1
midurlstr=mid(rightstr,urlLocation+loopint,1)
if midurlstr="" then exit do
loop
endURLstr=mid(rightstr,urllocation,loopint)
URLstr="<a href="&endURLstr&">"&endURLstr&"</a>"
rightstr=mid(rightstr,urllocation+loopint)
finalstr=finalstr&URLstr
loopint=1
Loop
end if
finalstr=finalstr&rightstr
convertstr1=finalstr
finalstr=""
mailLocation=instr(convertstr1,"@")
if mailLocation<>0 then
Do while mailLocation<>mailLocationend
mailLocation=instr(convertstr1,"@")
mailLocationend=InStrRev(convertstr1,"@")
mainmidmailstr=mid(convertstr1,mailLocation+1,1)
midmailstr=mainmidmailstr
do while (asc(midmailstr)>=45) and (asc(midmailstr)<=126)
loopint1=loopint1+1
midmailstr=mid(convertstr1,mailLocation-loopint1,1)
loop
firstSTR=mid(convertstr1,mailLocation-loopint1+1,loopint1-1)
finalstr=finalstr&left(convertstr1,mailLocation-loopint1)
midmailstr1=mainmidmailstr
do while (asc(midmailstr1)>=45) and (asc(midmailstr1)<=126)
loopint2=loopint2+1
midmailstr1=mid(convertstr1,mailLocation+loopint2,1)
if midmailstr1="" then exit do
loop
secondSTR=mid(convertstr1,mailLocation,loopint2)
endmailstr=firstSTR&secondSTR
mailstr="<a href=mailto:"&endmailstr&">"&endmailstr&"</a>"
finalstr=finalstr&mailstr
convertstr1=mid(convertstr1,maillocation+loopint2)
loopint1=1
loopint2=1
Loop
end if
finalstr=finalstr&convertstr1
URLconvert=finalstr
end function
%>
随着计算机硬件的发展,许多朋友购买了新的计算机,但是以前机器上的硬盘都舍不得丢弃,所以就拿它们作为一个备份硬盘使用。但是这也给大家带来了一个问题——安装了双硬盘之后,原先硬盘上的盘符与新硬盘上的盘符会出现交叉的情况,也就是说C盘是安装了操作系统物理盘的一个分区,但是D盘就变成另外一个物理盘的盘符了,这样在使用的时候就有些麻烦。而且当你将第二个硬盘拆卸下来刻盘或者是作为它用的时候,整个系统中的文件路径就会出错:安装在D盘上的文件不见了,而安装在E盘上的程序转移到D盘上,除非你再将第二硬盘挂上,否则就只能手工对其进行修正。笔者的计算机也刚升级,而且也使用了双硬盘,所以带着这个问题仔细对系统进行了一番研究,最后终于找出了解决之道,要是你也被这种难堪所困扰的话,不妨来看看如何解决双硬盘交叉盘符的问题。
一、系统升级
第一个方法也是最简单的就是将你所使用的操作系统升级到Windows 2000。因为Windows 2000采用的内核与Windows 9X不同,而且对于多个硬盘的辨识能力与处理能力比Windows 9X要高出一筹,所以采用Windows 2000之后,安装双硬盘的时候系统会自动把新硬盘的盘符添加到原先硬盘盘符后面。
但是Windows 2000对于硬件的要求实在是太高了,大家千万不要相信微软信誓旦旦的“Pentium 133、32M内存”的标准配置,难道你想在安装的时候喝完一杯茶而安装进度还没有增加百分之一?或者是在使用的时候移动一下鼠标带来的就是“哗哗”的硬盘响声?所以对于那些机器不够棒的朋友,还是建议你采用后面说到的两种方法。
二、CMOS修改
如果你使用的是Windows 98操作系统,那么可以在CMOS中将第二硬盘的选项设置为“NONE”。比如挂接在第一根硬盘线的Slave端,就在CMOS中设置“IDE Primary Slave”为“NONE”,这样在开机的时候系统会省去对第二硬盘的查找,进入Windows 98之后,你会发现第二块硬盘已经被找到,而且交叉盘符的现象也不复存在。
不过遗憾的是,这种方法只有在Windows 98操作系统下才能实现的,如果你使用Windows 95就不能享受这种便利的设置优势了。而且即使你采用的是Windows 98系统,只要切换到DOS状态的时候,第二硬盘就会自动消失,要是你需要经常在DOS下处理文件,那么这种方法还不是最佳的解决之道。
三、分区大法
事到如今,还有最后一招,保管你一劳永逸,绝无后顾之忧,这就是对第二块重新分区。采用这种方法,无论在什么操作系统下,CMOS中如何设置,都可以解决盘符交叉的问题。想必这就是大家所最为关注的,所以在此对其的操作步骤介绍一下。
1、将两块硬盘安装好之后,开机的时候按下“F8”键并选择相应的选项进入DOS状态。
2、键入“Fdisk”,然后会看见分区主界面,其中比以往大家所看见的多出了第五个选项“Change current fixed disk drive”,选择此项之后按回车键继续。
3、接下来看见的是硬盘以及分区列表,这时大家选中第二个硬盘,然后按照先删除扩展分区,再删除主分区的步骤将这块硬盘上的分区删除。
4、在对第二硬盘重新建立分区的时候要注意,一定不能选择“Create Primary DOS Partition”在这块硬盘上创建主分区,而要选择“Create Extended DOS Partition”把所有的空间都分配给扩展分区使用。接着再按照自己的需要把这个硬盘分为多个分区。
5、分区完毕之后,重新启动计算机,等进入Windows之后调用资源管理器会发现原先交叉的盘符现在已经老老实实的按照规矩排列了,这时再对它们进行格式化处理,这块第二硬盘就可以像原先的那块一样正常使用了。
但是这种方法也有一个缺点,就是会完全破坏第二硬盘上的数据,不过说起来也好解决,现在的硬盘都是又平又靓(又便宜又好)了,像主流的20G硬盘,只要八百多元,完全可以把你早期只有1G多的内容全部复制过来了吧。
好了,到此为止,解决双硬盘盘符交叉的三种方法全部告诉大家了,至于你选用哪一种就看你自己的实际情况了。
首先了解什么是IIS连接数。
IIS连接数指并发连接数,什么意思呢?
要分几种情况:(以100M空间50人在线为例)
A 用户单点下载你的文件,结束后正常断开,这些连接是按照瞬间计算的,就是说你50人的网站瞬间可以接受同时50个点下载
B 用户打开你的页面,就算停留在页面没有对服务器发出任何请求,那么在用户打开一面以后的15分钟内也都要算一个在线,就是说你50人的网站15分钟内可以接受不同用户打开50个页面
C 上面B的情况用户继续打开同一个网站的其他页面,那么在线人数按照用户最后一次点击(发出请求)以后的15分钟计算,在这个15分钟内不管用户怎么点击(包括新窗口打开)都还是一人在线。
D 当你的页面内存在框架(Iframe),那么每多一个框架就要多一倍的在线!因为这相当于用户同一时间向服务器请求了多个页面。
E 当用户打开页面然后正常关闭浏览器,用户的在线人数也会马上清除。
然后了解什么是论坛在线人数。
论坛在线只是计算一定时间内的活动用户数。
这里的时间用户可以自己设定(删除不活动用户时间),动网论坛默认为40分钟的相对准确值。
根据上面的说明,显然论坛在线和IIS连接数的概念不同
为什么会出现IIS连接数和论坛在线不符合的情况?
现具体分析如下:
1:您使用了插件版论坛!
现在的插件很**,不但占服务器资源,而且会使论坛运行变慢( 没有插件可以快一倍以上 ),同时很占在线人数,有的插件调用很多框架,少则2、3个,多则4、5个! 甚至有在线播放音乐,这样一个人在线就相当与很多人在线!
2:您的网站是主页+论坛的形式!
这样主页和论坛要争夺你的在线人数!
3:你的论坛内部有播放器!
一个人在线,然后他在线播放音乐,就占二个人在线!
4:你的论坛内部存在框架形式的网页!
每一个框架,就多一倍的在线!
5:你的论坛设置在线时间过小!
动网默认为40分钟, 这个默认值下,一般我们20IIS的学习型主机可以达到50人左右 ,因为论坛在线只是计算一定时间内的活动用户数,当您设定的时间较小的时候,看起来论坛在线的人数就自然少了,请把 删除不活动用户时间 改为默认的40分钟就可以!
6:你的空间存在多个论坛!
有的客户在一个空间里上传多个论坛,如bbs bbs1 bbs2 等等 等等
毫无疑问,这样个论坛也是要争夺再线人数的!
7:你的论坛图片等文件被人盗链!
比如:你的论坛有张图片文件,被粘贴(注意是粘贴不是上传)到别的论坛!
别的论坛的用户在浏览该文件的时候也算一个在线人数!
尤其是LOGO连接的时候注意,一定要对方把您的LOGO上传到他的空间!
8:你的空间上放有下载文件!
如果用户用网络蚂蚁类的软件,每一个线程就表示一个在线,非常厉害
9:最新发现如果网站首页直接调用论坛的新帖子可能导致IIS超出标准建议网站使用静态页面
<%
'------------------------------------------------------------------------
'-------------------无垠网域:http://www.5inet.net/ ---------------------
'-------------------作者:嘻哈呵嘿 ,webmaster@5inet.net -----------------
'----------远程获取内容,并将内容存在本地电脑上,包括任何文件!----------
'---------------利用xmlhttp和adodb.stream,酷!绝对原创!-----------------
'On Error Resume Next
'Set the content type to the specific type that you are sending.
'Response.ContentType = "IMAGE/JPEG"
'-------------------------------定义输出格式-----------------------------
Path=request.querystring("p")
sPath = Path
if left(lcase(path),7) <> "http://" then
'-------------如果前面没有http就是本地文件,交给LocalFile处理------------
LocalFile(path)
else
'--------------------否则为远程文件,交给RemoteFile处理------------------
RemoteFile(Path)
end if
'Response.Write err.Description
sub LocalFile(Path)
'-------------------如果为本地文件则简单的跳转到该页面-------------------
Response.Redirect Path
End Sub
Sub RemoteFile(sPath)
'-------------------------处理远程文件函数------------------------------
FileName = GetFileName(sPath)
'-------------GetFileName为把地址转换为合格的文件名过程-------------
FileName = Server.MapPath("/UploadFile/Cache/" & FileName)
Set objFso = Server.CreateObject("Scripting.FileSystemObject")
'Response.Write fileName
if objFso.FileExists(FileName) Then
'--------------检查文件是否是已经访问过,如是,则简单跳转------------
Response.Redirect "/uploadfile/cache/" & GetFileName(path)
Else
'----------------否则的话就先用GetBody函数读取----------------------
'Response.Write Path
t = GetBody(Path)
'-----------------用二进制方法写到浏览器上--------------------------
Response.BinaryWrite t
Response.Flush
'-----------------输出缓冲------------------------------------------
SaveFile t,GetFileName(path)
'------------------将文件内容缓存到本地路径,以待下次访问-----------
End if
Set objFso = Nothing
End Sub
Function GetBody(url)
'-----------------------本函数为远程获取内容的函数---------------------
'on error resume next
'Response.Write url
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
'----------------------建立XMLHTTP对象-----------------------------
With Retrieval
.Open "Get", url, False, "", ""
'------------------用Get,异步的方法发送-----------------------
.Send
'GetBody = .ResponseText
GetBody = .ResponseBody
'------------------函数返回获取的内容--------------------------
End With
Set Retrieval = Nothing
'response.Write err.Description
End Function
Function GetFileName(str)
'-------------------------本函数为合格化的文件名函数-------------------
str = Replace(lcase(str),"http://","")
str = Replace(lcase(str),"//","/")
str = Replace(str,"/","")
str = replace(str,vbcrlf,"")
GetFileName = str
End Function
sub SaveFile(str,fName)
'-------------------------本函数为将流内容存盘的函数-------------------
'on error resume next
Set objStream = Server.CreateObject("ADODB.Stream")
'--------------建立ADODB.Stream对象,必须要ADO 2.5以上版本---------
objStream.Type = adTypeBinary
'-------------以二进制模式打开-------------------------------------
objStream.Open
objstream.write str
'--------------------将字符串内容写入缓冲--------------------------
'response.Write fname
objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite
'--------------------将缓冲的内容写入文件--------------------------
'response.BinaryWrite objstream.Read
objstream.Close()
set objstream = nothing
'-----------------------关闭对象,释放资源-------------------------
'response.Write err.Description
End sub
%>