У меня такая проблема: написал небольшое Клиент/Серверное приложение (коды прилагаются ниже...). Так вот, возникла проблема со счетчиком подключенных WinSock (то есть Клиентов). Счет выполняется в процедуре ws_ConnectionRequest на Server и записываются в переменную SocketCounter. Когда испытывал все локально на одной машине, то запускал сначала несколько Client, потом Server и в SocketCounter все считалось правильно, ошибок не было. То есть на три копии Client... Server отображал количество - 3... Но в реальной(!) одноранговой сети ситуация получилась другая: SocketCounter выдает каждый раз разные значения! То есть реально физически 23 компьютера, а Server считает в SocketCounter то 45, то 67, 105, 34 и так далее. Не могу понять, что за хрень! Подскажите, пожалуйста, где я ошибся???
- Код: Выделить всё
'Server
'ws - WinSock
Dim SocketCounter As Long
Private Sub Form_Load()
Dim n As Long
'Включаем прослушивание портов...
On Error Resume Next
For n = 1 To SocketCounter
ws(n).Close
Unload ws(n)
Next
On Error GoTo t
ws(0).Close
ws(0).LocalPort = "5555"
ws(0).Listen
Exit Sub
t:
MsgBox "Error : " & Err.Description, vbCritical
End Sub
Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)
SocketCounter = SocketCounter + 1
Load ws(SocketCounter)
ws(SocketCounter).Accept requestID
'Выводим в Label количество подключенных машин...
lbl_Count.Caption = SocketCounter
End Sub
Private Sub cmd_SendData_Click()
'Рассылаем всем клиентам приветствие...
On Error Resume Next
Dim n As Long
For n = 1 To SocketCounter
ws(n).SendData "Hi"
Next
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim n As Long
For n = 1 To SocketCounter
ws(n).Close
Next
End
End Sub
- Код: Выделить всё
'Client
'ws - WinSock
Private Sub Form_Load()
Timer1.Enabled = True
With ws
.Close
.RemoteHost = "192.168.0.1"
.RemotePort = "5555"
End With
End Sub
Private Sub Timer1_Timer() 'Interval - 500 ms
'Подключаемся...
If ws.State <> sckConnected Then
ws.Close
ws.Connect
End If
DoEvents
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
ws.GetData Data
MsgBox Data
End Sub
Private Sub Form_Unload(Cancel As Integer)
ws.Close
End Sub