Solved

VB Winsock server communications using UDTs

Posted on 1998-12-23
9
267 Views
Last Modified: 2013-11-13
Does anyone have a GOOD example of using the Winsock control in a server to communicate with multiple clients using any type of messaging/UDTs? Especialy if the message is longer than a single TCP/IP packet.

An example could be a server that processes application request for multiple clients and returns results or just other messages. Another example would be a game server controlling several players.

0
Comment
Question by:eelpark
9 Comments
 
LVL 1

Author Comment

by:eelpark
ID: 1452270
Please, don't send the simple examples from MSDN, MS Support, or ones that use simple one line messages delimited by CRLF. ;-)
0
 
LVL 1

Accepted Solution

by:
twolff earned 100 total points
ID: 1452271
I just finished a decent sized project that communicated by winsock using tcpip. The data could be one or multiple packets. I just created a begin transmission and end transmission standard that would let me know when to start a new buffer or process the message. I can send sample code if you want, but the concepts are still the same as msdn samples.
0
 
LVL 1

Author Comment

by:eelpark
ID: 1452272
I am just looking for a good example. I know the concepts but I just want to see it working in VB. ;-)

If you can send me the code I'll go ahead and close this question.

BTW, does it handle multiple clients?
Thanks
0
 
LVL 3

Expert Comment

by:covington
ID: 1452273
Does it have to use the winsock layer?

I have a component that uses mailslots and handles multiple clients...
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 1

Expert Comment

by:twolff
ID: 1452274
Here is the code that handle the connection request. I am spawning multiple process of another application and conversing using tcpip. I did not take out any of the code that spawn the new process for fear of breaking something and not giving you the full effect of the code. Below this is the code that maintains the multiple buffers in the DataArrival event. Hope this helps. Enjoy.

Private Sub sckClient_ConnectionRequest(Index As Integer, ByVal requestID As Long)
'*************************************************************
'* Written By: Todd Wolff
'* Date:       January 7, 1999
'*
'* Syntax:     sckClient_ConnectionRequest(Index,requestID)
'*
'* Paramters:  Index       Index of the control in the array
'*             requestID   ID of the Connection Request
'*
'* Purpose: This is a winsock event. It is fired when a
'*          connection is requested from a remote winsock.
'*          This will try to reuse closed connections
'*          otherwise it will add a winsock to the array
'*          and make the connection.
'*************************************************************
   Dim x As Integer
   
   On Error GoTo sckClient_ConnectionRequest_Err

   If Index = 0 Then
      '--- try to find a connection that is closed
      For x = 1 To m_intLastClient
         '--- if the state is closed then exit the loop
         If sckClient(x).State = sckClosed Or sckClient(x).State = sckClosing Then
            '--- just a precaution
            m_strClientBuffer(x) = vbNullString
            sckClient(x).Close
            Exit For
         End If
      Next 'x
      '--- if a winsock is closed x will equal the number
      '--- that was closed. If a no winsock was found
      '--- to be closed x will be equal to m_intLastClient
      '--- plus one.
      If x > m_intLastClient Then
         m_intLastClient = x
         '--- add the new winsock to the control array
         ReDim Preserve m_strClientBuffer(m_intLastClient)
         Load sckClient(m_intLastClient)
      End If
      '---
      With sckClient(x)
'      With sckClient(m_intLastClient)
         '--- set the port of the control
         .LocalPort = 0
         '--- accept the request
         .Accept requestID
         '--- save processid for later
         .Tag = m_dblLastProcess
         
         '--- id there is a message then send it now
'                                      sckClient(m_intLastClient),
         If Len(m_strCurrMsgCode) > 0 Then
            g_objProcesses.RunSQLStmt m_strCurrMsgCode, _
                                      m_strCurrID, _
                                      m_strCurrlParam, _
                                      m_strCurrwParam, _
                                      sckClient(x), _
                                      m_dblLastProcess
           
            '--- reset the current message variables
            m_strCurrMsgCode = vbNullString
            m_strCurrID = vbNullString
            m_strCurrlParam = vbNullString
            m_strCurrwParam = vbNullString
         End If
      End With
   Else
      MsgBox "Index = " & Index
   End If

sckClient_ConnectionRequest_Exit:
   Exit Sub

sckClient_ConnectionRequest_Err:
   LogError Err.Number, Err.Source, Err.Description
   Resume sckClient_ConnectionRequest_Err
   
End Sub

'****************** Data Arrival Event *******************'

Private Sub sckClient_DataArrival(Index As Integer, ByVal bytesTotal As Long)
'*************************************************************
'* Written By: Todd Wolff
'* Date:       January 4, 1999
'*
'* Syntax:     mvarWinsockConn_DataArrival(bytesTotal)
'*
'* Paramters:  bytesTotal  The number of bytes in the buffer
'*
'* Purpose: This is a winsock event. It is fired when the
'*          winsock receives data. This will receive the
'*          responses from the clients and will forward them
'*          through the outside winsock.
'*************************************************************
   Dim strData As String
   
   On Error GoTo sckClient_DataArrival_Err
   
   '--- get the data from the tcp buffer
   sckClient(Index).GetData strData
   
   '--- check the first character to see if we need to reset the buffer
   If Left$(strData, 1) = g_BOT Then
      '--- check the length of the buffer to ensure
      '--- that it is empty
      If Len(m_strClientBuffer(Index)) > 0 Then
         m_strClientBuffer(Index) = vbNullString
      End If
   End If
   
   '--- append the received data to the buffer
   m_strClientBuffer(Index) = m_strClientBuffer(Index) & strData
   
   '--- check the last character to see if
   '--- the transmission has ended
   If Right$(m_strClientBuffer(Index), 1) = g_EOT Then
      '--- reset the buffer and processing information
      strData = m_strClientBuffer(Index)
      m_strClientBuffer(Index) = vbNullString
     
      If m_bolCaptureIncoming Then
         m_bolClientReceived = True
      Else
         m_bolClientReceived = False
         '--- send the data to the client
         sckServer.SendData strData
      End If
      g_objProcesses("RS" & sckClient(Index).Tag).Processing = False
   End If

sckClient_DataArrival_Exit:
   Exit Sub

sckClient_DataArrival_Err:
   LogError Err.Number, Err.Source, Err.Description
   Resume sckClient_DataArrival_Exit
   
End Sub

0
 
LVL 1

Expert Comment

by:twolff
ID: 1452275
After posting the code, I noticed that it has been edited by someone. It should still work but some of the comments and dead code are not mine. Just a disclaimer. ;)
0
 
LVL 1

Author Comment

by:eelpark
ID: 1452276
Thanks for the answer. That is more or less what I was looking for.

Does "g_objProcesses...=false" fire an event or does it just run some code in a class module? (just curious)


0
 
LVL 1

Expert Comment

by:twolff
ID: 1452277
I am spawning an executable that I use winsock to talk to. g_objProcesses is the collection that houses the information about those spawned apps. The Processing flag lets me know if the spawned app is currently processing. If it is processing then I have to send a cancel message before I send a close message. If you have any other ?'s let me know.
0
 
LVL 13

Expert Comment

by:Mirkwood
ID: 1452278
Bought This Question.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Visual Basic Excel Formatting error 4 83
wordlen challenge 3 61
using Access 8 59
VBA filters 2 50
Whether you’re a college noob or a soon-to-be pro, these tips are sure to help you in your journey to becoming a programming ninja and stand out from the crowd.
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now