Solved

Sockets : application becomes very slow

Posted on 2004-10-19
9
212 Views
Last Modified: 2010-04-23
Hello,

I'm writing a PDA application in vb.net using the compact framework.  This application features a winsock listener to capture message from the host application.

The problem is : after receiving a message, my application becomes really slow.  Does anyone have a clue how this can be solved ?
0
Comment
Question by:ACAE
  • 6
  • 2
9 Comments
 
LVL 9

Expert Comment

by:checoo
ID: 12347285
can you post some code snippets...
0
 

Author Comment

by:ACAE
ID: 12347363
OK, here it comes :

I created as class called 'NavisionHost' :
----------------------------------------------
Imports System.Net.Sockets
Imports System.Text

Public Class NavisionHost
    Const READ_BUFFER_SIZE As Integer = 65536
    Private MyTCPClient As TcpClient
    Private readBuffer(READ_BUFFER_SIZE) As Byte

    Public Sub New(ByVal client As TcpClient)        
        Me.MyTCPClient = client

        ' This starts the asynchronous read thread.  The data will be saved into
        ' readBuffer.        
        ReDim readBuffer(READ_BUFFER_SIZE)
        Me.MyTCPClient.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, AddressOf StreamReceiver, Nothing)
    End Sub

    Public Event LineReceived(ByVal sender As NavisionHost, ByVal Data As String)

    Private Sub StreamReceiver(ByVal ar As IAsyncResult)
        Dim BytesRead As Integer
        Dim strMessage As String

        Dim liPosition As Integer = 0

        Try
            ' Ensure that no other threads try to use the stream at the same time.
            SyncLock MyTCPClient.GetStream
                ' Finish asynchronous read into readBuffer and get number of bytes read.
                BytesRead = MyTCPClient.GetStream.EndRead(ar)
            End SyncLock

            ' Convert the byte array the message was saved into, minus one for the
            ' Chr(13).
            If BytesRead > 0 Then
                strMessage = Encoding.ASCII.GetString(readBuffer, 0, BytesRead - 1)
                RaiseEvent LineReceived(Me, strMessage)
            End If

            ' Ensure that no other threads try to use the stream at the same time.
            SyncLock MyTCPClient.GetStream
                ' Start a new asynchronous read into readBuffer.
                MyTCPClient.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, AddressOf StreamReceiver, Nothing)
            End SyncLock
        Catch ex As Exception
        End Try
    End Sub
End Class

-----------------------
This class is used on the form that contains the listener :
-----------------------

 Private myTCPlistener As TcpListener
    Private myListenerThread As Threading.Thread = Nothing

'Enable listener
If Not (myListenerThread Is Nothing) Then
   myTCPlistener.Stop()
   myTCPlistener = Nothing
   myListenerThread = Nothing
End If
myListenerThread = New Threading.Thread(AddressOf  DoListen)
myListenerThread.Start()


Private Sub DoListen()        
StartDoListen:      
        Try
            If ucPublicInfo.LoggedOn And Not (ucPublicInfo.connIPAddress Is Nothing) Then
                If Not (myTCPlistener Is Nothing) Then
                    myTCPlistener.Stop()
                    myTCPlistener = Nothing
                End If
                myTCPlistener = New TcpListener(ucPublicInfo.connIPAddress, ucPublicInfo.iPortNum)
                myTCPlistener.Start()
                Do
                    If Not (ucNavisionHost Is Nothing) Then
                        ucNavisionHost = Nothing
                    End If
                    ucNavisionHost = New NavisionHost(myTCPlistener.AcceptTcpClient)

                    ' Create an event handler to allow the UserConnection to communicate
                    ' with the window.
                    AddHandler ucNavisionHost.LineReceived, AddressOf OnLineReceived
                Loop Until False
            End If
        Catch ex As Exception
          GoTo StartDoListen
        End Try
    End Sub

    Private Sub OnLineReceived(ByVal sender As NavisionHost, ByVal psdata As String)
        'In this procedure the received data (string containing XML document) is processed
        '....
    End Sub

Is this sufficient ?
0
 
LVL 27

Expert Comment

by:planocz
ID: 12348584
0
 
LVL 9

Accepted Solution

by:
checoo earned 500 total points
ID: 12354900
is your app becoming slow immediately after receiving the data or it becomes slow during the XML processing in OnLineReceived
0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 

Author Comment

by:ACAE
ID: 12355626
It becomes slow immediately after receiving the data.  I replaced the pocessing of the data with a simple messagebox and it remains slow.  Could it have something to do with the size of the receivebuffer ?
0
 

Author Comment

by:ACAE
ID: 12355782
Hi,

I hope this helps, I think I found the reason why it becomes slow but I don't know how to solve this.  
In the event 'streamreceiver' I replaced

If BytesRead > 0 Then
                strMessage = Encoding.ASCII.GetString(readBuffer, 0, BytesRead - 1)
                RaiseEvent LineReceived(Me, strMessage)
End If

with a messagebox, and this messagebox keeps showing on the PDA.  Do I need an endread or something ?

0
 

Author Comment

by:ACAE
ID: 12355789
Oops, just a bit too fast.  I have an endread just before the messagebox.  Then why does the message appear again ?
0
 

Author Comment

by:ACAE
ID: 12355854
Another bit of information that might help : the first time the event is called, 40 bytes are received, then always 0 (which is normal as there is nothing send)
0
 

Author Comment

by:ACAE
ID: 12367492
I found a solution : if bytesread is zero then i perform an exit sub.  This seems to be working for now.  Thanx for your help anyway.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now