0
votes

Right now i am developing a tool that will allow me to measure the delay between network connections using VB6 and a arduino UNO with ethernet shield. Now i am facing some issues with the Server code (the VB6 program). I have 2 winsocks with both different ports and they are both listening for the arduino client to connect. Now if i have only one active connection nothing goes wrong and everything works fine, but as soon as the second client connects the entire server starts going crazy. Suddenly it reports that the first client that connected lost it connection, so in short the server just doesn't want 2 clients connected at a time but i really do need it :/ What is going wrong?

I'll quickly explain what sertain command do that are send over the winsock to or from the server.

"SERVER_SLEEP" Is a command that the server sends to all clients that will tell them to enter a power saving mode. "SERVER_REQUESTS_DATA" Is a command that the server sends to a specific client and forces the client to send information like Device name and firmware version. "RESPOND_MESSAGE" Is a command that the server sends to all clients and the client is forced to respond to see if we still have an connection. "DEVICE_NAME=" Is a command that the client sends to the server when it just connects, It is required before we show that we have an connection by putting it into the listbox. (after the = comes the device name) "DEVICE_NAME_REP=" Is a command that the client sends to the server when the server requests information about the client, the reason i have 2 of them is because i couldn't reuse the previous one since then it would become way to complicated. (after the = comes the device name) "DEVICE_FIRMWARE=" Is a command that the client sends to the server when the server requests information about the client. (after the = comes the device firmware version) "DEVICE_OK=" Is a command that the client sends to the server when the server requests an answer to check if we still have an connection. (after the = comes the device name) "DEVICE_REBOOTING" Is a command that the client sends to the server when it goes out of sleep mode (it goes out of that mode when the server comes back online again after it was closed) After the client send that message it immediately closes the connection again and the device is forced to reboot to make sure nothing goes wrong.

My code:

Dim DeviceIP1 As String
Dim DeviceIP2 As String
Dim UpdateListStatus As Integer

Private Sub Command1_Click()
MsgBox Socket1.State
MsgBox Socket2.State
End Sub

Private Sub Command3_Click()
If Dir(App.Path & "\TH.exe") <> "" Then 'Traceroute Helper application i wrote before, Works 100% and is not relevant for the issue i am facing
Shell App.Path & "\TH.exe " & DeviceIP, vbNormalFocus
Else
MsgBox "Missing file!" & vbNewLine & "File TH.exe is required for the requested operation!", vbCritical + vbSystemModal, "Missing file"
End If
End Sub

Private Sub Form_Load()
Socket1.Listen
Socket2.Listen
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim msg As VbMsgBoxResult
msg = MsgBox("Are you sure you want to exit?" & vbNewLine & "All the clients will be put into sleep mode.", vbYesNo + vbQuestion + vbSystemModal, "Quit")
If msg = vbYes Then
  Form3.Show
  Cancel = True
  Form1.Visible = False
Else
  Cancel = True
End If
End Sub

Private Sub List1_Click()
On Error GoTo errhandler
Dim ClientFound As Boolean
DeviceIP = Mid(List1.Text, InStr(List1.Text, "-") + 1)
DeviceIP = LTrim(DeviceIP)
DeviceIPLabel.Caption = "Device IP: " & DeviceIP
Form2.Show
    If Socket1.RemoteHostIP = DeviceIP Then
    Socket1.SendData ("SERVER_REQUESTS_DATA")
    ElseIf Socket2.RemoteHostIP = DeviceIP Then
    Socket2.SendData ("SERVER_REQUESTS_DATA")
    End If
Exit Sub
errhandler:
If Err.Number = 40006 Then
MsgBox "Socket error!" & vbNewLine & "The requested device might be offline.", vbCritical + vbSystemModal, "Socket error"
Unload Form2
End If
End Sub

Private Sub UpdateList_Timer()
On Error Resume Next
If List1.ListCount > 0 Then
If UpdateListStatus = 0 Then
TempList.Clear

Socket1.SendData ("RESPOND_MESSAGE")
Socket2.SendData ("RESPOND_MESSAGE")

UpdateListStatus = 1
UpdateList.Interval = 5000
ElseIf UpdateListStatus = 1 Then
List1.Clear
For x = 0 To TempList.ListCount
List1.AddItem (TempList.List(x))
Next x

For X2 = 0 To List1.ListCount
If List1.List(X2) = "" Then 'Check if we have any items that are nothing
List1.RemoveItem (X2)
End If
Next X2

Label1.Caption = "Connected clients: " & List1.ListCount
UpdateListStatus = 0
UpdateList.Interval = 10000
End If
End If
End Sub

Private Sub Socket1_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim TempString As String
Dim TempString2 As String
Dim position As Integer

Socket1.GetData TempString, vbString
    position = InStr(1, TempString, "DEVICE_NAME=")
    If position > 0 Then 'It is a device name command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       List1.AddItem (TempString2 + " - " + Socket1.RemoteHostIP)
       Label1.Caption = "Connected clients: " & List1.ListCount
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_NAME_REP=")
    If position > 0 Then 'It is a device name command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       DeviceNameLabel.Caption = "Device name: " & TempString2
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_FIRMWARE=")
    If position > 0 Then 'It is a device firmware command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       DeviceFirmwareLabel.Caption = "Firmware version: " & TempString2
       Unload Form2 'Since this is the last piece we will be receiving we can close this window
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_OK=")
    If position > 0 Then 'It is a device respond command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       TempList.AddItem (TempString2 + " - " + Socket1.RemoteHostIP)
       Label1.Caption = "Connected clients: " & List1.ListCount
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_REBOOTING")
    If position > 0 Then 'It is a device respond command from a client
       Socket1.Close
       TempString2 = ""
    End If
Text1.Text = Text1.Text & TempString & vbNewLine
TempString = ""
position = 0
TempString2 = ""
End Sub

Private Sub Socket2_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim TempString As String
Dim TempString2 As String
Dim position As Integer

Socket2.GetData TempString, vbString
    position = InStr(1, TempString, "DEVICE_NAME=")
    If position > 0 Then 'It is a device name command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       List1.AddItem (TempString2 + " - " + Socket2.RemoteHostIP)
       Label1.Caption = "Connected clients: " & List1.ListCount
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_NAME_REP=")
    If position > 0 Then 'It is a device name command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       DeviceNameLabel.Caption = "Device name: " & TempString2
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_FIRMWARE=")
    If position > 0 Then 'It is a device firmware command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       DeviceFirmwareLabel.Caption = "Firmware version: " & TempString2
       Unload Form2 'Since this is the last piece we will be receiving we can close this window
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_OK=")
    If position > 0 Then 'It is a device respond command from a client
       TempString2 = Mid(TempString, InStr(TempString, "=") + 1)
       TempList.AddItem (TempString2 + " - " + Socket2.RemoteHostIP)
       Label1.Caption = "Connected clients: " & List1.ListCount
       TempString2 = ""
    End If
    position = 0
    position = InStr(1, TempString, "DEVICE_REBOOTING")
    If position > 0 Then 'It is a device respond command from a client
       Socket2.Close
       TempString2 = ""
    End If
Text1.Text = Text1.Text & TempString & vbNewLine
TempString = ""
position = 0
TempString2 = ""
End Sub


Private Sub Socket1_ConnectionRequest(ByVal requestID As Long)
If Socket1.State <> sckClosed Then
    Socket1.Close
    ' Accept the request with the requestID
    ' parameter.
    Socket1.Accept requestID
End If
End Sub

Private Sub Socket2_ConnectionRequest(ByVal requestID As Long)
If Socket2.State <> sckClosed Then
    Socket2.Close
    Socket2.Accept requestID 'Allow the connection
End If
End Sub

`

2
How are you connecting ? TCP ? if so , are you using different ports ? post some code please.Stavm
Sorry, accidently hit enter way to soon so that why there was no code available :/ Oh and i am using TCP, port 2444 for socket1 and port 2445 for socket2Sander B.

2 Answers

1
votes

There's a lot there to dig through (You probably want to try to create a MCVE of the problem just to make your own debugging easier), but at first glance those ConnectionRequest event handlers seem suspect to me. The Winsock Control ConnectionRequest Event documentation says to "Use the Accept method (on a new control instance) to accept an incoming connection." You're trying to somehow use the same control instance, which maybe there's a way to do but isn't the standard approach.

If memory serves (it's been forever since I've dealt with this), you want to create a Control Array of Winsock Controls, and load a new instance at run time to handle each new connection (and unload it when the connection is complete). The "listening" control and the "handling a current connection" control need to be different instances. That way, each instance handles its own connection with its own state, and the listener is available to handle any new incoming connections.

1
votes

Okay so i was able to find a very good example code for a multi-client server And also i was able to figure out that the time out delay i created was WAY too short so that was why it was disappearing from the list. Sometimes it takes 10 seconds to receive a response and the time out was set to only 5 seconds MAX. But still thanks for trying to help me :)

The link to the example code :LINK