Källkoden för /anders.enges/vb/inet2.asp
<!--#include file="../inc/navstuff.asp" -->
<P>För att köra lite mer "<EM>low level</EM>" nätverk kan man använda Winsock komponenten i VB. </P>
<P>Bästa stället att börja leta efter exempel är i VB hjälpen under Office 97 development, kapitel 15.</P>
<P>Nedan ges även ett litet exempel på en WWW server </P>
<P>Programmet förutsätter en <B>TextBox</B> med namnet <B>txtOutput</B> samt två <B>Winsock </B>kontroller med namnen <B>httpListen</B> och <B>httpServer</B></P>
<DIV class=code>
<P>Option Base 1<BR>Option Explicit<BR>' kanske inte ASP men lite åt det hållet!<BR>Const cTemplate = "<html><title>#TITLE#</title><body>#BODY#</body></html>"</P>
<P>' en liten array som exempel<BR>Dim testArray As Variant<BR><BR>Private Sub Form_Load()<BR>    ' initiera arrayen<BR>    testArray = Array("EN ETTA", "EN TVÅ", "EN TREA", "O FYRA", "KANSKE FEM")<BR><BR>    ' vi använder port 1002<BR>    ' exempel URL (lokal) http://127.0.0.1:1002/1<BR>    httpListen.LocalPort = 1002<BR><BR>    On Error Resume Next<BR>    httpListen.Listen<BR>    OutputString "NOT Listening "<BR>    On Error GoTo 0<BR><BR>    If httpListen.State = sckListening Then<BR>        ClearOutputString<BR>        OutputString "Listening "<BR>    End If<BR>End Sub</P>
<P>Private Sub httpServer_Close()<BR>    If httpServer.State <> 0 Then<BR>        httpServer.Close<BR>    End If<BR>    OutputString " Close "<BR>End Sub</P>
<P>Private Sub httpServer_Connect()<BR>    OutputString "Connect "<BR>End Sub</P>
<P>Private Sub httpListen_ConnectionRequest(ByVal requestID As Long)<BR>    If httpServer.State <> sckClosed Then httpServer.Close<BR>    OutputString "Connecting "<BR>    httpServer.Accept requestID<BR>End Sub</P>
<P>Private Sub httpServer_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)<BR>    OutputString "SERVER: " & Number & vbCrLf & Description<BR>End Sub</P>
<P>Private Sub httpListen_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)<BR>    OutputString "LISTEN" & vbCrLf & Number & vbCrLf & Description<BR>End Sub</P>
<P>' Sänta datat färdigt<BR>Private Sub httpServer_SendComplete()<BR>    OutputString vbCrLf & "Send OK"<BR>    ' Vi är väl klara med sändningen och kan stänga förbindelsen<BR>    httpServer.Close<BR>End Sub</P>
<P>' någon frågar någonting</P>
<P>Private Sub httpServer_DataArrival(ByVal bytesTotal As Long)<BR>    Dim strData As String<BR>    Dim strResponse As String<BR>    Dim strTemp As String<BR>    Dim whatItem As Integer  </P>
<P>    ' tag emot datat (förfrågan i HTTP sammanhang)<BR>    httpServer.GetData strData<BR>    OutputString "Getting Data: "<BR>    OutputString strData</P>
<P>    strTemp = ExtractGetRequest(strData)     </P>
<P>    ' i detta exempel returnerar vi bara ett värde från arrayen<BR>    If IsNumeric(strTemp) Then<BR>        whatItem = CInt(ExtractGetRequest(strData))<BR>    Else<BR>        whatItem = 9999 ' dumt men detta är bara ett exempel...<BR>    End If    </P>
<P>    OutputString "Sending: "        </P>
<P>    If whatItem <= UBound(testArray) And whatItem > 0 Then<BR>        strResponse = MakeResponse(testArray(whatItem), _<BR>                                   "Super Delux Nonsens Server")<BR>    Else<BR>        strResponse = MakeResponse("<p>Sorry...</p>" & _<BR>                                    "<p>Finns ingenting att säga om " & _<BR>                                    strTemp & "</p>")<BR>    End If</P>
<P>    OutputString strResponse</P>
<P>    ' sänd det formatterade datat<BR>    httpServer.SendData strResponse<BR>End Sub</P>
<P>Private Function MakeHeader(ByVal Data As String) As String<BR>    Dim strHeader As String<BR>    Dim dateNow As Date<BR>    dateNow = Now</P>
<P>    strHeader = "HTTP/1.0 200 OK" & vbCrLf<BR>    strHeader = strHeader & "Date: " & GMTformat(dateNow) & vbCrLf<BR>    strHeader = strHeader & "Server:  NonsenseServer/1.0" & vbCrLf<BR>    strHeader = strHeader & "Content-Type: text/html" & vbCrLf<BR>    strHeader = strHeader & "Last-Modified: " & GMTformat(dateNow) & vbCrLf<BR>    ' observera att headern måste sluta med två CRLF<BR>    strHeader = strHeader & "Content-Length: " & Len(Data) & vbCrLf & vbCrLf<BR>    MakeHeader = strHeader<BR>End Function</P>
<P>Private Function MakeResponse(ByVal Data As String, Optional Title As String) As String<BR>    Dim strHeader As String<BR>    Dim strTemplate As String<BR>    Dim dateNow As Date<BR>    If IsMissing(Title) Then<BR>        Title = "MinSpecialServer"<BR>    End If</P>
<P>    dateNow = Now<BR>    strTemplate = cTemplate</P>
<P>    ' byt ut #TITLE# i mallen till den verkliga titeln<BR>    strTemplate = Replace(cTemplate, "#TITLE#", Title)</P>
<P>    ' byt ut #BODY# i mallen till den verkliga texten<BR>    strTemplate = Replace(strTemplate, "#BODY#", Data)</P>
<P>    strHeader = MakeHeader(strTemplate)<BR>    MakeResponse = strHeader & strTemplate<BR>End Function</P>
<P>' formaterar datum som t.ex. Tue, 12 Sep 2000 22:18:26 GMT<BR>Private Function GMTformat(ByVal theDate As Date) As String<BR>    Dim Days As Variant<BR>    Dim Months As Variant<BR>    Days = Array("Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat")<BR>    Months = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")<BR>    GMTformat = Days(Weekday(theDate, vbSunday)) & _<BR>                Format(theDate, ", d ") & _<BR>                Months(Month(theDate)) & _<BR>                Format(theDate, " yyyy Hh:Nn:Ss G\MT")<BR>End Function</P>
<P>' HTTP förfrågan börjar alltid med GET /xxx HTTP/1.x<BR>' där x kan vara 0 eller 1 beroende på vilken <BR>' protokoll standard som browsern stöder (oftast 1.1)<BR>' om man använt http://www.sajt.com:1002/xxx<BR>' plocka ut det som kommer efter GET men före HTTP i denna sträng<BR>Private Function ExtractGetRequest(ByVal theString As String) As String<BR>    Dim indStart As Long<BR>    Dim indEnd As Long<BR>    indStart = InStr(theString, "GET ") + 5<BR>    indEnd = InStr(theString, " HTTP") - 5<BR>    ExtractGetRequest = Mid(theString, indStart, indEnd)<BR>End Function</P>
<P>' hjälpfunktioner för hantering av textboxen<BR>Private Sub OutputString(ByVal theString As String)<BR>    If Len(txtOutput.Text) > 32000 Then<BR>        ClearOutputString<BR>    End If<BR>    txtOutput.Text = txtOutput.Text & vbCrLf & theString & vbCrLf<BR>End Sub</P>
<P>Private Sub ClearOutputString()<BR>    txtOutput.Text = ""<BR>End Sub</P></DIV>
<!--#include file="../inc/footer.asp" -->