Search code examples
vb6stack-overflowwinsockdoevents

VB6 Winsock multiple TCP connections > problems with DoEvents


I made a software couple years ago using VB6 that works as a TCP server, receives multiple connections from clients.

The basic Idea of the software is to listen on a specific port, accept connections from different clients and pass each connection to a separate winsock which analyzes the data, looks in DB, replies with the proper message, and then closes the connection.

Here's some code:

Initializing the sockets when the application starts:

For i = 1 To MaxCon    
    Load sckAccept(i)
Next i
sckListen.Listen

Accepting connections:

Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)
    Dim aFreeSocket As Integer
    aFreeSocket = GetFreeSocket
    If aFreeSocket = 0 Then
        sckAccept(0).Accept requestID
        sckAccept(0).SendData "Server is full!"
        sckAccept(0).Close
    Else
        sckAccept(aFreeSocket).Accept requestID        
End Sub

Receiving data, analyzing it, and reply:

Private Sub sckAccept_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim sData As String  
    sckAccept(Index).GetData sData
    'Do lots of analyizing and search in DB
    '
    '
    sckAccept(Index).SendData "Message"
    '
    '
    DoEvents
    sckAccept(Index).Close
End Sub

Everything was working fine, but now the number of connections has increased (couple dozens per second), so the software started getting Out of stack space exception (because of DoEvents).

I know that in many cases DoEvents is evil, but if I remove it, the application UI won't respond (because of the over load on the thread) and some data might not be delivered.

So, my question is: does anyone have an idea of how to get around this problem with/without using DoEvents?


Note: I know that VB6 doesn't really support multi-threading and might be a PITA for such situations. I'm actually planning to upgrade the software and re-create it using .Net, but that will take some time. That's why I need to fix this problem in VB6 since the software is written in VB6 for now.


Solution

  • Well, I managed to figure out the problem, and have solved it.

    The short answer

    Do NOT use DoEvents.. Some data won't be delivered? Well, close the connection ONLY in the SendComplete event.


    The long answer

    First thing first:

    Why I used DoEvents in the first place? because some of the sent messages were not being delivered. A lot of articles/questions on the internet suggest using DoEvents after Socket.SendData in order to guarantee the data arrival to the receiver.

    I digged deeper into this trying to figure out why the messages aren't delivered. I found out that this problem only occurs when closing the connection after sending the message:

    Socket.SendData "Message"
    '
    '
    Socket.Close
    

    So, I simply moved the line that closes the connection to the SendComplete event, removed the DoEvents sentence -since I don't need it anymore-, and the problem is gone :)

    Private Sub sckAccept_SendComplete(Index As Integer)
        sckAccept_Close (Index)
    End Sub
    

    I hope this could help someone who has the same problem.