home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 September / Chip_2002-09_cd1.bin / zkuste / vbasic / Data / Utils / XZipComp.exe / XceedWinsock.Cab / F112734_NetClient.bas < prev    next >
Encoding:
BASIC Source File  |  2000-05-11  |  8.4 KB  |  247 lines

  1. Attribute VB_Name = "NetClient"
  2. '
  3. ' Xceed Winsock Library Sample: Tron Sample
  4. ' Copyright (c) 2000 Xceed Software Inc.
  5. '
  6. ' [Code module for client event handling]
  7. '
  8. ' This sample application for the Xceed Winsock Library demonstrates
  9. ' service advertising and service lookup using the SAP protocol, as
  10. ' well as connectionless asynchronous byte transfers using the IPX
  11. ' protocol. All transfer events are handled via the "Implements"
  12. ' statement. To successfully create a game, you must have the SAP
  13. ' protocol installed on your system. Otherwise, you can only list
  14. ' and join games.
  15. '
  16. ' This file is part of the Xceed Winsock Library Samples.
  17. ' The source code in this file is only intended as a supplement
  18. ' to Xceed Winsock Library's documentation, and is provided "as is",
  19. ' without warranty of any kind, either expressed or implied.
  20. '
  21.  
  22. Option Explicit
  23.  
  24. ' Variables for communicating to server and receiving events
  25.  
  26. Dim GameServerAddress As Address               ' The address of the game server we are joined to
  27. Dim ClientSocket As ConnectionlessSocket       ' Our socket for communicating to the game server
  28. Dim ClientEvents As ClientTransferEvents       ' Our event handlers for byte transfer notifications
  29. Dim ClientEventsCookie As Long                 ' A cookie assigned to our implemented evetn handler interface
  30.  
  31. ' A random number tag string identifying ourselves to the server
  32.  
  33. Public PlayerTag As String
  34.  
  35. ' Call this procedure to setup a client socket in order to be able to join a game
  36. '
  37. Public Function SetUpClientSocket() As Boolean
  38.     
  39.     Dim xProtocols As New Protocols
  40.     Dim xProtocol As Protocol
  41.                 
  42.     On Error GoTo ClientSocketSetupError
  43.                 
  44.     ' Get the protocol we want to use (in this case, IPX)
  45.                 
  46.     Set xProtocol = xProtocols.GetProtocol(wafIpx, wstUnspecified, wptNS_IPX)
  47.             
  48.     ' Create the client socket
  49.             
  50.     Dim SF As New SocketFactory
  51.         
  52.     Set ClientSocket = SF.CreateConnectionlessSocket(xProtocol, 0)
  53.  
  54.    ' Instantiate our implementation of the IaXWAddressedByteTransferEvents interface
  55.    ' which contains event handlers for handling data the client socket receives.
  56.     
  57.     Set ClientEvents = New ClientTransferEvents
  58.     
  59.     ' Inform the Xceed Winsock Library that we have implemented an interface which
  60.     ' can receive notifications (events) related to byte transfers. More specifically,
  61.     ' we use the wtaAdviseReceivedAlways flag to specify we are only interested in
  62.     ' receiving events concerning incoming data, and no other events. The "cookie"
  63.     ' is a value kept for later, in order to tell the library we no longer need
  64.     ' notifications.
  65.         
  66.     ClientEventsCookie = ClientSocket.AddressedByteTransferAdvise(ClientEvents, wtaAdviseReceivedAlways)
  67.     
  68.     SetUpClientSocket = True
  69.         
  70.     Exit Function
  71.         
  72. ClientSocketSetupError:
  73.  
  74.     Call GameForm.PrintInfo("Error seting up the client socket: " & Err.Description, True, vbRed)
  75.     
  76.     SetUpClientSocket = False
  77.     
  78.     Exit Function
  79.    
  80. End Function
  81.  
  82. ' Shuts down the client socket because a game has been unjoined.
  83. '
  84. Public Sub ShutdownClientSocket()
  85.  
  86.     On Error GoTo ClientSocketShutdownError
  87.  
  88.     ' Tell the Xceed Winsock Library we no longer need to be advised of incoming data
  89.     
  90.     ClientSocket.AddressedByteTransferUnadvise (ClientEventsCookie)
  91.     
  92.     ' Free the instantiated objects we no longer need
  93.     
  94.     Set ClientEvents = Nothing
  95.     Set ClientSocket = Nothing
  96.  
  97.     Exit Sub
  98.         
  99. ClientSocketShutdownError:
  100.  
  101.     MsgBox "Error closing the client socket: '" & Err.Description & "'", vbExclamation, "Tron Sample"
  102.    
  103.     Exit Sub
  104.  
  105. End Sub
  106.  
  107. ' Call this procedure to request a connection with a game server.
  108. ' The GameNumber parameter specifies which of the listed game
  109. ' servers (kept in the GameAddresses array) to join.
  110. '
  111. Public Sub ConnectToGameServer(GameNumber As Integer)
  112.  
  113.     Set GameServerAddress = GameAddresses(GameNumber) ' Get the game server's address
  114.     
  115.     ' Request to join the game, providing our player name while we're at it.
  116.     
  117.     Call SendClientSignal(sRequestJoinGame, "<player name=" & Chr$(34) & GameForm.GetLocalName() & Chr$(34) & "></player>", False)
  118.  
  119. End Sub
  120.  
  121. ' Send a client signal to the joined game server
  122. '
  123. Public Sub SendClientSignal(GS As Signals, Data As String, WaitForDataSent As Boolean)
  124.  
  125.     Dim baData() As Byte
  126.  
  127.     On Error GoTo SendClientSignalError
  128.         
  129.     ' We convert the string data into a byte array so we can send it out
  130.     ' to the server using one of Xceed Winsock Library's Byte Transfer methods.
  131.  
  132.     baData = StrConv("<Tron tag=" & PlayerTag & " signal=" & CStr(GS) & ">" & Data & "</Tron>", vbFromUnicode)
  133.  
  134.     If WaitForDataSent = False Then
  135.  
  136.         ' Send data out asynchronously. We don't care when it happens, so
  137.         ' we haven't set up any AdviseByteTransferEvents for outgoing data.
  138.         
  139.         Call ClientSocket.AsyncSendBytesTo(GameServerAddress, baData, 0, wsoNone)
  140.                 
  141.     Else
  142.     
  143.         ' Send data with a blocking call, so when the following SendBytesTo
  144.         ' method call completes, we know the data has actually been sent on
  145.         ' its way by the library. We use this only in the case where the
  146.         ' client is quitting the game and wants to make sure the sUnjoining
  147.         ' client signal is sent to the server before the client socket is
  148.         ' closed. If we sent it asynchronously, we could not be sure the data
  149.         ' was sent before our socket is closed and all outgoing data is erased.
  150.     
  151.         Call ClientSocket.SendBytesTo(GameServerAddress, baData, wsoNone)
  152.     
  153.     End If
  154.     
  155.     Exit Sub
  156.         
  157. SendClientSignalError:
  158.  
  159.     Call GameForm.PrintInfo("Error sending signal to server: " & Err.Description, True, vbRed)
  160.     
  161.     Exit Sub
  162.     
  163. End Sub
  164.  
  165.  
  166. '   List available game servers using the SAP protocol
  167. '
  168. Public Sub ListGames()
  169.  
  170.     Dim SM As New ServiceManager
  171.     Dim SPS As ServiceProviders
  172.     Dim SP As ServiceProvider
  173.         
  174.     On Error GoTo ListGamesError
  175.         
  176.     ' Update the game interface to indicate search has started
  177.         
  178.     Call GameForm.PrintInfo("Searching for games...", False, vbBlack)
  179.     
  180.     Call GameForm.SetState(isStartBusy)
  181.     
  182.     ' Disable any submenus in the "Join game" menu.
  183.     
  184.     If JoinGameSubmenuMaxIndex > 0 Then
  185.         Dim I As Integer
  186.         For I = 1 To JoinGameSubmenuMaxIndex ' First menu item can't be made invisible
  187.             GameForm.mnuGamesList(I).Visible = False
  188.         Next I
  189.     End If
  190.     
  191.     DoEvents
  192.     
  193.     ' Start searching for advertised service providers that have
  194.     ' the appropriate service provider GUID
  195.             
  196.     Set SPS = SM.EnumServiceProviders("*", GameGuid, 1, False, wnsSAP, "", "", Empty, "", Empty, wesUseRemoteAddress)
  197.     
  198.     GamesFound = 0
  199.         
  200.     For Each SP In SPS
  201.         GamesFound = GamesFound + 1
  202.         
  203.         ' Add the game name to the GameNames array
  204.         
  205.         ReDim Preserve GameNames(GamesFound) As String
  206.         GameNames(GamesFound) = SP.Name
  207.                 
  208.         ' Add the game address to the GameAddresses array
  209.                 
  210.         ReDim Preserve GameAddresses(GamesFound) As Address
  211.         Set GameAddresses(GamesFound) = SP.ServiceAddresses(0).RemoteAddress
  212.         
  213.         ' Add the game name as an option in the "Join game" submenus.
  214.         
  215.         If GamesFound > (JoinGameSubmenuMaxIndex + 1) Then
  216.             Load GameForm.mnuGamesList(GamesFound - 1)
  217.             JoinGameSubmenuMaxIndex = GamesFound - 1
  218.         End If
  219.         
  220.         GameForm.mnuGamesList(GamesFound - 1).Caption = GameNames(GamesFound)
  221.         If GamesFound > 1 Then GameForm.mnuGamesList(GamesFound - 1).Visible = True
  222.         GameForm.mnuGamesList(GamesFound - 1).Enabled = True
  223.         
  224.         ' Display the game which was found.
  225.         
  226.         Call GameForm.PrintInfo("Found " & SP.Name & " (Game " & CStr(GamesFound) & ")", True, vbBlack)
  227.         
  228.         DoEvents ' Update screen
  229.         
  230.     Next SP
  231.         
  232.     If GamesFound = 0 Then
  233.         Call GameForm.PrintInfo("No games found.", False, vbBlack)
  234.     End If
  235.  
  236.     Call GameForm.SetState(isStopBusy)
  237.  
  238.     Exit Sub
  239.         
  240. ListGamesError:
  241.  
  242.     Call GameForm.PrintInfo("Error listing games: " & Err.Description, True, vbRed)
  243.     
  244.     Exit Sub
  245.  
  246. End Sub
  247.