VB6 Winsock多个TCP连接> DoEvents的问题

时间:2016-05-31 05:56:39

标签: vb6 stack-overflow winsock doevents

几年前,我使用VB6作为TCP服务器制作软件,从客户端接收多个连接。

该软件的基本思想是监听特定端口,接受来自不同客户端的连接,并将每个连接传递给单独的winsock,分析数据,查看数据库,回复正确消息,然后关闭连接。

以下是一些代码:

在应用程序启动时初始化套接字:

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

接受连接:

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

接收数据,分析数据并回复:

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

一切正常,但现在连接数量增加了(每秒几十个),因此软件开始出现Out of stack space异常(因为DoEvents)。

我知道在很多情况下DoEvents是邪恶的,但是如果我删除它,应用程序UI将不会响应(因为线程上的负载过重)并且某些数据可能无法传递。

所以,我的问题是:有没有人知道如何使用/不使用DoEvents解决此问题?

注意:我知道VB6并不真正支持多线程,可能是这种情况下的PITA。我实际上计划升级软件并使用.Net重新创建它,但这需要一些时间。这就是我需要在VB6中解决这个问题的原因,因为该软件目前是用VB6编写的。

1 个答案:

答案 0 :(得分:1)

好吧,我设法解决了问题,并解决了它。

简短回答

请勿使用DoEvents ..有些数据无法投放?好吧,仅在SendComplete事件中关闭连接。

答案很长

第一件事:

为什么我首先使用DoEvents?因为某些发送的消息未被传递。互联网上的很多文章/问题建议在DoEvents之后使用Socket.SendData以保证数据到达接收方。

我深入研究了这个问题,试图找出为什么没有传递这些信息。我发现只有在发送消息后关闭连接时才会出现此问题:

Socket.SendData "Message"
'
'
Socket.Close

所以,我只是移动了关闭SendComplete事件连接的行,删除了DoEvents句子 - 因为我不再需要它了 - 问题就消失了: )

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

我希望这可以帮助那些遇到同样问题的人。