以下转自MSDN:接受多个连接请求
上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法。下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求。Private intMax As LongPrivate Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End SubPrivate Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub
上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法。下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求。Private intMax As LongPrivate Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End SubPrivate Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub
解决方案 »
- 求助 vb检测硬件出厂日期
- 赵老虎升4星了,祝贺一下。另外奉上老虎幼年美图若干
- 从一个窗口用数据库做一个用户密码验证保存该用的信息,并在另一个窗口调出来?
- VB怎么删除系统变量?
- 用VB把Word文档、网页文件等放到SQL SERVER哪个字段里好,怎么个读写法?谢谢了
- 请问如何用VBScript获取当前用户所在域?
- 急! 为何我的"引用"里找不到"Microsoft Transaction Server "?
- 下面语句有什么错误?
- xxgrid下拉问题
- 浏览网页(使用系统默认安全属性,它可以修改我机器上的哪些东东?)
- 怎样声明sleep
- treeview控件中怎么获得父接点的内容?急!在线等待,高分
Private Sub Wsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim ArrayIndex As Integer '遍历WinSock控件数组时使用
Dim OpenSocketPos As Integer '新连接有使用的WinSock所使用的控件代号
Dim Dummy As StringIf Not SrvFlag Then Exit SubArrayIndex = 0
OpenSocketPos = 0
Do While (OpenSocketPos = 0) And (ArrayIndex < UBound(gActiveSockets))
ArrayIndex = ArrayIndex + 1
If Not gActiveSockets(ArrayIndex).connected Then '如果在已打开的控件数组中找到一个空隙位置,则选定位置后停止遍历
OpenSocketPos = ArrayIndex
End If
LoopIf OpenSocketPos = 0 Then '如果没有可用的WinSock控件实例,则生新一个新的控件实例
OpenSocketPos = UBound(gActiveSockets) + 1
ReDim Preserve gActiveSockets(OpenSocketPos)
End IfLoad Wsock(OpenSocketPos)
gActiveSockets(OpenSocketPos).connected = True '标记实例
Wsock(OpenSocketPos).Accept requestID
gActiveSockets(OpenSocketPos).ClientIP = Wsock(OpenSocketPos).RemoteHostIP
gActiveSockets(OpenSocketPos).ClientName = Wsock(OpenSocketPos).RemoteHost
Sbar.Panels(1) = "已连接:" + gActiveSockets(OpenSocketPos).ClientIP
lstSTATE.AddItem "客户 " + gActiveSockets(OpenSocketPos).ClientIP + " 已经连接!" + Sps + Str(Now)
End Sub