2

I am new to this. am not sure if anybody used game ranger before and I am trying to create something more simple.

client and server connection, the client connects to the server pc over the internet using the playit.gg provided ip:port and it connects ok.

now I wonder if there is anything else needed for the game to detect other ips in-game multiplayer screen?.

I have a multi-connection server and IP vb6 source. simple using Winsock.

were you see the server:port is inputted from

.RemoteHost = "write-mechanical.at.playit.gg"
.RemotePort = "55224"

chat client side to connect

Option Explicit

    Private Sub cmdConnect_Click()
        'Check input.
        txtServer.Text = Trim$(txtServer.Text)
        txtPort.Text = Trim$(txtPort.Text)
        txtNickname.Text = Trim$(txtNickname.Text)
        
        If Len(txtServer.Text) = 0 Or Len(txtPort.Text) = 0 Or _
           Len(txtNickname.Text) = 0 Then
            
            MsgBox "Please fill in all fields!", vbCritical
            Exit Sub
        ElseIf Not IsNumeric(txtPort.Text) Then
            MsgBox "Invalid port value!", vbCritical
            Exit Sub
        End If
        
        'Done with that...
        strMyNickname = txtNickname.Text
        
        With frmChat.sckClient
            .Close
            bolRecon = False
            .RemoteHost = txtServer.Text
            .RemotePort = txtPort.Text
            .Connect
        End With
        
        Me.Hide
        frmChat.Show
        AddStatusMessage frmChat.rtbChat, RGB(128, 128, 128), "> Connecting to " & txtServer.Text & ":" & txtPort.Text & "..."
    End Sub
    
    Private Sub txtPort_KeyPress(KeyAscii As Integer)
        'Number only.
        If Not IsNumeric(Chr$(KeyAscii)) And Not KeyAscii = 8 Then KeyAscii = 0
    End Sub

and server-side to accept

With frmChat
        .sckServer(0).Close
        .sckServer(0).LocalPort = CInt(txtPort.Text)
        .sckServer(0).Listen 'Opens the winsock control.
    End With

Dim strNotify
Dim strPacket As String
Option Explicit

'JUST USED FOR FORM RESIZING.
Private Type RECT
    rctLeft As Long
    rctTop As Long
    rctRight As Long
    rctBottom As Long
End Type

'JUST USED FOR FORM RESIZING.
Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

'JUST USED FOR FORM RESIZING.
Private udtMyRect As RECT

Private Sub sckServer_Close(Index As Integer)
    sckServer(Index).Close
    
    Dim strPacket As String
    
    strPacket = "LEA" & Chr$(2) & udtUsers(Index).strNickname & Chr$(4)
    SendGlobalData strPacket
    
    AddUserEntersLeaves rtbChat, udtUsers(Index).strNickname, False
    RemoveListItem lstUsers, udtUsers(Index).strNickname
    
    With udtUsers(Index)
        .strBuffer = vbNullString
        .strIP = vbNullString
        .strNickname = vbNullString
    End With
    
End Sub

'A client is attempting to connect.
'----------------------------------
'Another computer is trying to connect to the server.
'Find a socket we can use to handle the connection.
'Then load a slot in the udtUsers() array for this user.
Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim intNext As Integer
    
    intNext = ModChat.NextOpenSocket
    
    If intNext > 0 Then
        'Found a socket to use; accept connection.
        sckServer(intNext).Accept requestID
        
        'Check if there is a slot open for this connection
        'in the users array.
        If UBUsers < intNext Then
            'There isn't, load one.
            ReDim Preserve udtUsers(intNext) As CHAT_USER
        End If
        
        '(Re)set this client's info.
        With udtUsers(intNext)
            .strIP = sckServer(intNext).RemoteHostIP
            .strNickname = vbNullString
        End With
        
        'We haven't received the user's nickname yet.
        'That will happen in the DataArrival event :)
        'Once it does, we will need to let everyone know that this person joined the room.
        AddStatusMessage rtbChat, RGB(0, 0, 128), "> " & sckServer(intNext).RemoteHostIP & " connected!"
    End If
    
End Sub

Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strData As String, strPackets() As String
    Dim strTrunc As String, bolTrunc As Boolean
    Dim lonLoop As Long, lonTruncStart As Long
    Dim lonUB As Long
    
    'Get the received data.
    sckServer(Index).GetData strData, vbString, bytesTotal
    
    With udtUsers(Index)
        'Append it to the buffer.
        .strBuffer = .strBuffer & strData
        strData = vbNullString
        
        'Check if the last byte is the packet delimiter (Chr$(4)).
        'If it is, there are no truncated packets.
        'If it isn't, the last packet got split up. >:(
        If Right$(.strBuffer, 1) <> Chr$(4) Then
        
            'Get all data to the right of the last Chr$(4) which is the truncated packet.
            bolTrunc = True
            
            'Find position of last packet delimiter.
            lonTruncStart = InStrRev(.strBuffer, Chr$(4))
            
            'Check if it was found.
            If lonTruncStart > 0 Then
                'Extract out the truncated part.
                strTrunc = Mid$(.strBuffer, lonTruncStart + 1)
            End If
            
        End If
        
        'We checked if the data was truncated.
        'If it was, we put that part away for now and set the Truncated flag to TRUE (bolTrunc).
        
        'Split up the data buffer into individual packets
        'in case we received more than 1 at a time.
        'Process them individually.
        If InStr(1, .strBuffer, Chr$(4)) > 0 Then
            strPackets() = Split(.strBuffer, Chr$(4))
            
            'Now all of the individual packets are in strPackets().
            'Loop through all of them.
            lonUB = UBound(strPackets) 'Get number of packets.
            'If the data is truncated, don't process the last one
            'because it isn't complete.
            If bolTrunc Then lonUB = lonUB - 1
            
            'Start looping through all packets.
            For lonLoop = 0 To lonUB
                'Check length of packet.
                'Each packet has a command/header,
                'the packet must be at least that length.
                'In this example, all headers are 3 bytes/characters long.
                If Len(strPackets(lonLoop)) > 3 Then
                    'Look at the header and process the packet accordingly.
                    Select Case Left$(strPackets(lonLoop), 3)
                        
                        'Packet is a chat message.
                        Case "MSG"
                            'Process message.
                            ParseChatMessage Index, strPackets(lonLoop)
                            
                        'User is connecting (sending nickname).
                        Case "CON"
                            'Process connection.
                            ParseConnection Index, strPackets(lonLoop)
                        'Add your own here! :)
                        'Case "XXX"
                            'Do something.
                        
                        'Case "YYY"
                            'Do something.
                            
                    End Select
                End If
            Next lonLoop
        
        End If
        
        'We're done processing all packets.
        Erase strPackets
        
        'Now we can erase all the data we just processed from the buffer.
        'Otherwise, it will just keep growing in size and the same data
        'will be processed over and over (which might actually be kinda cool?).
        .strBuffer = vbNullString
        
        If bolTrunc Then
            'Still have a piece of a packet left over because the data was truncated.
            'Erase the buffer then put just the truncated part back in.
            .strBuffer = strTrunc
        End If
        
        strTrunc = vbNullString
    End With
    
End Sub

just a quote from my comment laying out what I want to do.

the server is in my computer running and they connect to me from another house over the internet using the ip and port provided by playitt.gg ok so now that i know they are connected to my machine via the server app. now i want to know is will multiplayer games be able to detect those ips even we got same game same version installed

hans
  • 129
  • 7
  • It's hard to understand exactly what you're trying to do but, I think what you're asking is how to find all the people connected to the chat server? In that case all the connections information would be in udtUsers. I don't know from the code posted where udtUsers is created or what the data structure is of the class object but, that's your List of all connected "users" (or whatever data object that array holds.) – Byrd Jun 28 '22 at 21:36
  • server is in my computer running and they connect to me from another house over the internet using the ip and port provided by playitt.gg ok so now that i know they are conneted to my machine via the server app. now i want to know is will multiplayer games be able to detect those ips even we got same game same version installed – hans Jun 28 '22 at 22:14
  • 1
    I'm guessing PlayIt is a tunneling tool? I don't think the multiplayer game will know based off this code you're seeing now. That should be handled in the multiplayer game itself. This code would just transfer data using RemoteHost as the server you're connecting to and anyone else connecting to it. – Byrd Jun 28 '22 at 22:26
  • you are correct the server and client are able to join chat but how do i make the games know that this ip is availble and so it shows in in multiplayer. gameranger and other vpn how do they work then – hans Jun 28 '22 at 22:46
  • kindly look at this something about broadcasting i know am mising something https://stackoverflow.com/questions/3208757/scanning-lan-game-servers-using-winsock – hans Jun 28 '22 at 22:53
  • I am unaware of how GameRanger works, but looking through the websites for it and playit.gg, I would assume that just as you had to enter the IP/Port for the chat to connect, you would have to enter the same IP/Port for game ranger as well.. there is nothing about the one that would _automatically_ talk to the other to help them, but it doesn't mean one couldn't be added programatically.. But, that said, I didn't find any SDK for GameRanger in the 5m i was on their site. – User51 Jul 01 '22 at 13:25
  • For "multiplayer games be able to detect those ips" you would need a separate VPN network adapter registered with the OS for the broadcasts to be sent through your tunnel. You just cannot write such driver in VB6 but can use `wintun` (search it) or similar driver from your VB6 app the way Wireguard client used to do on Windows. – wqw Jul 02 '22 at 08:29

0 Answers0