【发布时间】:2014-03-11 22:47:47
【问题描述】:
我有一个应用程序,它监听多个连接并验证用户是否处于活动状态
我使用 WSAASyncSelect 的 1 线程套接字处理方法。
问题是有时很多用户同时连接时,有些用户没有得到回复
我认为这是因为尚未调用“发送”并且程序已收到另一个连接,因此它会再次处理新连接而忽略前一个连接。就像 WSAASyncSelect 已触发,现在它处理新连接而不是完成先前的请求。
那么如何解决这个问题呢?我试图通过在处理连接时使用零参数调用它来临时停止来自 WSAASyncSelect 的事件,直到完成它然后重新启用网络事件,但这也无济于事。
这里是处理事件的代码(接收然后解密然后比较字节然后根据列表框中的内容发送数据,即是否活跃用户)
这要求接收 FD_READ
WSAAsyncSelect s, frmMain.hwnd, 0, 0 'Disabling Notifications event
Do Until bytesRecieved = SOCKET_ERROR
bytesRecieved = recv(wParam, buffer(Bytes), 500, 0)
If bytesRecieved > 0 Then
Bytes = Bytes + bytesRecieved
ElseIf bytesRecieved = 0 Then
Exit Sub
End If
Loop
Call MemCopy(ByVal decryptedArrival, buffer(0), Bytes)
WSAAsyncSelect s, frmMain.hwnd, WINSOCKMSG, FD_CONNECT + FD_READ + FD_CLOSE + FD_ACCEPT + FD_WRITE
If frmMain.chkSaveLog.value = vbChecked Then
frmMain.txtConnectionsLog.Text = frmMain.txtConnectionsLog.Text & Now & " Receiving a connection (" & wParam & ")" & vbNewLine
AutoScroll
If frmMain.chkAutoSave.value = vbChecked Then
strCurrentLogLine = Now & " Receiving a connection (" & wParam & ")"
AutoSaveLog (strCurrentLogLine)
frmMain.cmdClearLogs.Enabled = True
End If
End If
下面是字节的解密,然后按 ID 比较字节标识符,如 1 = 检查更新 2 - 发送用户信息等
在 Select Case 语句中,然后是发送 Api。
以及接受程序
这在接收 FD_ACCEPT 时调用
Function AcceptConnection(wParam As Long)
lpString = String(32, 0)
AcSock = accept(wParam, sockaddress, Len(sockaddress))
strTempIP = getascip(sockaddress.sin_addr)
frmMain.txtConnectionsLog.Text = frmMain.txtConnectionsLog.Text & Now & " Getting a connection from IP address: " & _
strTempIP & " (" & AcSock & ")" & vbNewLine
AutoScroll
If frmMain.chkAutoSave.value = vbChecked Then
strCurrentLogLine = Now & " Getting a connection from IP address: " & strTempIP & " (" & AcSock & ")" & vbNewLine
AutoSaveLog (strCurrentLogLine)
End If
End Function
对于更好的性能有什么建议吗?
【问题讨论】:
-
请出示您的实际代码。您可能对事件处理不当。
-
感谢您的回复。我已经编辑了问题并添加了代码。
-
那种代码不是使用
WSAAsyncSelect()的正确方法。 -
那么正确的方法是什么?我的错误在哪里?
-
查看我刚刚发布的答案。
标签: sockets networking vb6 window connection