Right Now I've been working on a text based game for fun. It was working fine but they I relized that you need to shut/close the ports. Before I was just opening ports and not shutting them, no problems because it will just go to the next port. But this way is not correct. I started shutting the ports but now I get the error of the 'user' not being in the correct socket when its checking etc. For example: User 1 logs in, user 2 logs in as well. User one logs off, User 2 tries to talk or such but cannot because the server thinks theres only 1 socket being used.. (Basicly thinks hes in socket one since you minus a socket on logoff) I personally don't know how to fix it. I tried a few things with ports but they didn't work correctly, I am stumped to how to fix it. Personally I think it should move or detect theres a missing port and go to the next one since its closed or something like that. I'm not really sure.. Welp, here is some coding....
and basicly something id use would be..
Everything is FINE until someone disconnects because it doesn't know how to handle exiting properly i think.
Personally the getdata is fine, but its the sockets. I do not know how to move or skip sockets that aren't in use. Another example would be 2 people on, one disconnects, the first person disconnects.. so person on socket 2 other person cannot talk because its trying to send the data to a invalid socket (thinking its socket 1 I believe) Something like that.. Any help? Need more info?
Code:
'Enable listening on port 25001 Private Sub Form_Load() Dim i As Integer packetDelimiter = Chr$(0) Set dbdata = OpenDatabase(App.Path & "/data/data.mdb") ' opens database file RoomLimitNumber = 0 ItemLimitNumber = 0 Call LoadRooms 'Pause For i = 1 To 50 DoEvents Next i Call LoadItems 'Load all the sockets and timers WStcpServer(0).LocalPort = 25001 WStcpServer(0).Listen num = 0 'User count End Sub 'When a connection is recieved, goto verifying stages Private Sub WStcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long) num = num + 1 Load WStcpServer(num) Load Timer3(num) Load tmrrefresh(num) WStcpServer(num).Accept requestID 'Add a user to the arrays. Prevents making a 'limit' to the amount of users you can have. MsgSend = "¿caut¶" & "Verify" 'Ask for verification blnRetVal = WinsockSend(WStcpServer(num), MsgSend) End Sub 'Preform this when a client closes or disconnects Private Sub WStcpServer_Close(Index As Integer) Dim i As Integer If Not users(Index) = "" Then 'If there was no connection or bad login, then don't do this, otherwise continue txtMain.Text = txtMain.Text & "Disconnected: " & WStcpServer(Index).RemoteHostIP & ": " & users(Index) & vbCrLf For i = WStcpServer.LBound + 1 To WStcpServer.UBound If userroom(i) = userroom(Index) Then If users(i) = users(Index) Then Else 'Leave the game message MsgSend = "~g" & users(Index) & " has just left the game!" blnRetVal = WinsockSend(WStcpServer(i), MsgSend) End If End If Next users(Index) = "" 'Clear the username from the users. Frees up a socket. End If WStcpServer(Index).Close Unload WStcpServer(Index) Unload Timer3(Index) Unload tmrrefresh(Index) num = num - 1 End Sub
and basicly something id use would be..
Code:
'Chat Sub Private Sub PublicChat(ByVal Index As Integer, Comarray() As String, ComI As Integer) Dim i As Integer 'Send to all users in room For i = WStcpServer.LBound + 1 To WStcpServer.UBound If userroom(i) = userroom(Index) Then 'In the room? MsgSend = "~yFrom " & "~w" & users(Index) & "~y: " & Comarray(ComI) blnRetVal = WinsockSend(WStcpServer(i), MsgSend) Else End If Next End Sub
Personally the getdata is fine, but its the sockets. I do not know how to move or skip sockets that aren't in use. Another example would be 2 people on, one disconnects, the first person disconnects.. so person on socket 2 other person cannot talk because its trying to send the data to a invalid socket (thinking its socket 1 I believe) Something like that.. Any help? Need more info?