Tcplistener based webserver - connection reset..

Hostium

Member
Joined
Jan 23, 2009
Messages
21
Programming Experience
Beginner
Hi guys, I have an application that acts as a tcplistener serving GET requests from a web browser. My problem is that on Internet Explorer and Opera the program is doing fine apart from once in a while reseting the connection, although for some reason on Google Chrome i'm getting this error 98% of the time...

VB.NET:
Error 101 (net::ERR_CONNECTION_RESET): Unknown error.

Firefox is acting very much the same way as Google Chrome.

I'm new to programming and VB.NET, i'm really not sure what could be cause this problem.. here's the code..

VB.NET:
   Public Sub HttpPage()
        Try
            Dim hostName As String = Dns.GetHostName()
            Dim serverIP As IPAddress = Dns.GetHostEntry(hostName).AddressList(1)

            Dim Port As String = txtPort.Text

            Dim tcpListener As New TcpListener(serverIP, Int32.Parse(Port))

            tcpListener.Start()

            lblStatus.Text = "Web server started at: " & serverIP.ToString() & ":" & Port

            Me.tcpListener = tcpListener
            Dim serverThread As New Thread(New ParameterizedThreadStart(AddressOf ProcessThread))
            serverThread.Start()

        Catch ex As Exception
            Console.WriteLine(ex.StackTrace.ToString())
        End Try
    End Sub
  Public Sub ProcessThread()
        Dim clientSocket As System.Net.Sockets.Socket
        While (True)
            Try
                clientSocket = tcpListener.AcceptSocket()
                ' Socket Information
                Dim clientInfo As IPEndPoint = CType(clientSocket.RemoteEndPoint, IPEndPoint)

                Console.WriteLine("Client: " + clientInfo.Address.ToString() + ":" + clientInfo.Port.ToString())

                ' Set Thread for each Web Browser Connection
                Dim clientThread As New Thread(New ParameterizedThreadStart(AddressOf ProcessRequest))
                clientThread.Start(clientSocket)

            Catch ex As Exception
                Console.WriteLine(ex.StackTrace.ToString())

                If clientSocket.Connected Then

                End If

            End Try
        End While
    End Sub
    Public Sub ProcessRequest(ByVal clientSocket As System.Net.Sockets.Socket)
        Dim recvBytes(900000) As Byte
        Dim htmlReq As String = Nothing
        Dim bytes As Int32

        Try
            ' Receive HTTP Request from Web Browser
            bytes = clientSocket.Receive(recvBytes, 0, clientSocket.Available, SocketFlags.None)
            htmlReq = Encoding.ASCII.GetString(recvBytes, 0, bytes)

            ' Set WWW Root Path
            Dim rootPath As String = Directory.GetCurrentDirectory() & "\Monitor\" & GetName() & "\"

            ' Set default page
            Dim defaultPage As String = GetName() & ".html"

            Dim strArray() As String
            Dim strRequest As String

            strArray = htmlReq.Trim.Split(" ")

            ' Determine the HTTP method (GET only)
            If strArray(0).Trim().ToUpper.Equals("GET") Then
                strRequest = strArray(1).Trim

                If (strRequest.StartsWith("/")) Then
                    strRequest = strRequest.Substring(1)
                End If

                If (strRequest.EndsWith("/") Or strRequest.Equals("")) Then
                    strRequest = strRequest & defaultPage
                End If

                strRequest = rootPath & strRequest

                sendHTMLResponse(strRequest, clientSocket)

            Else ' Not HTTP GET method
                strRequest = rootPath & "Error\" & "400.html"

                sendHTMLResponse(strRequest, clientSocket)
            End If

        Catch ex As Exception
            Console.WriteLine(ex.StackTrace.ToString())

            If clientSocket.Connected Then
                clientSocket.Close()
            End If
        End Try
    End Sub

    ' Send HTTP Response
    Private Sub sendHTMLResponse(ByVal httpRequest As String, ByVal clientsocket As System.Net.Sockets.Socket)
        Try

            Dim info As New IO.FileInfo(httpRequest)
            'Set HTML Header
            Dim htmlHeader As String = _
                "HTTP/1.0 200 OK" & ControlChars.CrLf & _
                "Server: WebServer 1.0" & ControlChars.CrLf & _
                "Content-Length: " & info.Length & _
                "Content-Type: " & getContentType(httpRequest) & _
                ControlChars.CrLf & ControlChars.CrLf

            ' The content Length of HTML Header
            Dim headerByte() As Byte = Encoding.ASCII.GetBytes(htmlHeader)

            Console.WriteLine("HTML Header: " & ControlChars.CrLf & htmlHeader)

            ' Send HTML Header back to Web Browser
            clientsocket.Send(headerByte, 0, headerByte.Length, SocketFlags.None)

            ' Send HTML Content back to Web Browser
            Dim stream As IO.FileStream = info.OpenRead
            Dim buffer(200000) As Byte
            Dim read As Integer = -1
            Do Until read = 0
                read = stream.Read(buffer, 0, buffer.Length)
                clientsocket.Send(buffer, 0, read, SocketFlags.None)
            Loop
            stream.Close()

            ' Close HTTP Socket connection
            clientsocket.Shutdown(SocketShutdown.Both)
            clientsocket.Close()

        Catch ex As Exception
            Console.WriteLine(ex.StackTrace.ToString())

            If clientsocket.Connected Then
                clientsocket.Close()
            End If
        End Try
    End Sub

    ' Get Content Type
    Private Function getContentType(ByVal httpRequest As String) As String
        If (httpRequest.EndsWith("html")) Then
            Return "text/html"
        ElseIf (httpRequest.EndsWith("htm")) Then
            Return "text/html"
        ElseIf (httpRequest.EndsWith("txt")) Then
            Return "text/plain"
        ElseIf (httpRequest.EndsWith("gif")) Then
            Return "image/gif"
        ElseIf (httpRequest.EndsWith("jpg")) Then
            Return "image/jpeg"
        ElseIf (httpRequest.EndsWith("jpeg")) Then
            Return "image/jpeg"
        ElseIf (httpRequest.EndsWith("pdf")) Then
            Return "application/pdf"
        ElseIf (httpRequest.EndsWith("pdf")) Then
            Return "application/pdf"
        ElseIf (httpRequest.EndsWith("doc")) Then
            Return "application/msword"
        ElseIf (httpRequest.EndsWith("xls")) Then
            Return "application/vnd.ms-excel"
        ElseIf (httpRequest.EndsWith("ppt")) Then
            Return "application/vnd.ms-powerpoint"
        Else
            Return "text/plain"
        End If
    End Function

Any help would be greatly appreciated..
 
Last edited:
I just noticed that the web server is performing well on one of my computers and not on the other, that leads me to believe it's got something to do with that computers connection settings?
 
Back
Top