0

我想知道同时处理多个连接的最佳稳定方法是什么?

我正在使用 vb6,目前使用的是 winsock api 的 no Winsock 控件。我之前尝试过,它也不是多线程的。

目前,当线程忙于发送数据时,只有一个线程效率不高,另一个连接器被延迟。直到线程空闲。

我正在使用 WSAAsyncSelect 非阻塞套接字。

因此,由于 VB6 在多线程方面不稳定。我正在考虑使用 ASM DLL,然后从处理连接的 vb6 调用它。但是最好的方法是什么?为每个连接创建一个线程,然后在recv 之后终止线程?或者保持连接一直打开,直到另一部分关闭它?

因为运行客户端的服务器没有那么好的规范。所以更多的线程会消耗更多的资源。

我对性能更好的了解不多,所以请分享您的意见。

另外如何确保所有数据都已从非阻塞套接字上的发送函数发送?

应该循环发送并计算每次发送多少字节?还是只调用一次?我注意到如果我发送的大数据无法在 1 次处理,我在调用 WSAAsyncSelect 时指定的处理网络事件的窗口会再次被调用,因此有更多数据要发送,但如何确保这是属于到这个部分发送?还是recv?

注意:最大可同时连接的连接数约为 100。

这是我在通过网络大小 (5 kb) 发送图片时遇到的问题示例

If Bytes = PicSize Then


        MsgBox "All data are sent 1 time"
        Else
            MsgBox "there is more data left"
            While Bytes <> PicSize
                bytesRecieved = recv(s, Buffer(Bytes), UBound(Buffer), 0)
                If bytesRecieved > 0 Then
                    Bytes = Bytes + bytesRecieved
                End If
                DoEvents
            Wend
        End If

recv 的返回值始终是 WSAEWOULDBLOCK,所以我进入了一个无限循环。有什么建议么?

4

1 回答 1

1

你问了不止一个问题,所以很难回答。无论是直接使用 async winsock 还是使用 WinSock 控件,重要的是要意识到,当您认为自己“忙于发送数据”时,您所做的只是将数据传递到网络堆栈。这发生得很快,您的代码将继续运行。希望这些数据最终会到达目的地。这部分不会很快发生,但您的代码已继续处理下一个任务。

于 2013-05-24T12:14:23.370 回答