【发布时间】:2013-05-22 19:06:32
【问题描述】:
我想知道同时处理多个连接的最佳稳定方式是什么?
我正在使用 vb6,目前使用的是 winsock api 的无 Winsock 控件。我之前尝试过,它也不是多线程的。
目前只有一个线程,当线程忙于发送数据时效率不高,另一个连接器被延迟。直到线程空闲。
我正在使用 WSAAsyncSelect 非阻塞套接字。
因此,由于 VB6 在多线程方面不稳定。我正在考虑使用 ASM DLL 然后从处理连接的 vb6 调用它。但是最好的方法是什么?为每个连接创建一个线程,然后在recv 之后终止线程?还是保持连接一直打开,直到另一部分关闭它?
因为运行客户端的服务器没有那么好的规范。所以更多的线程会消耗更多的资源。
我对性能更好的方面了解不多,所以请分享您的意见。
另外如何确保所有数据都已从非阻塞套接字上的发送函数发送?
应该循环发送并计算每次发送多少字节?还是只调用一次?我注意到如果我发送的大数据无法在 1 次处理,我在调用 WSAAsyncSelect 时指定的处理网络事件的窗口会再次被调用,因此有更多数据要发送,但如何确保这是属于到这个部分发送?还是recv?
注意:最多可以同时连接100个左右。
这是我在通过网络大小 (5 kb) 发送图片时遇到的问题示例 有时它通过 1 个 recv 调用全部接收,而有时它被分成几部分
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,所以我进入了一个无限循环。 有什么建议吗?
【问题讨论】:
-
MASM?汇编?另外:你的 VB6 家伙是应用程序还是 DLL?
-
是的 MASM 汇编程序。我的 vb6 是应用程序 EXE 接收连接。不能让它多线程。我尝试了一切仍然有时会崩溃。不安全。
-
VB6 中的多线程意味着多次启动同一个应用程序;) 解决此类问题的 VB6 方法是为自己准备一个简洁的组件。例如 Chilkat Socket,它是异步工作的,所以即使是单个线程也应该能够处理很多连接。
-
人们已经使用 Winsock 控件与一台用 VB6 编写的服务器同时完成了数千个 TCP 连接,尽管这样的服务器产生了微不足道的回声并且仅用于演示。服务器做一些实用但不太密集的处理数百不应该是一个问题。 Winsock控件是异步的,性能非常好,建议你先看看自己的程序结构。
标签: multithreading sockets vb6