HOWTO: Send and Receive UDT's Using the Winsock Control (152058)



The information in this article applies to:

  • Microsoft Visual Basic Standard Edition, 32-bit, for Windows 4.0
  • Microsoft Visual Basic Professional Edition, 32-bit, for Windows 4.0
  • Microsoft Visual Basic Enterprise Edition, 32-bit, for Windows 4.0
  • Microsoft Internet ActiveX Controls 1.0

This article was previously published under Q152058

SUMMARY

The Winsock control methods SendData and GetData send and receive data through an argument declared of type variant. The following variant types are supported:
   Byte        vbByte
   Integer     vbInteger
   Long        vbLong
   Single      vbSingle
   Double      vbDouble
   Currency    vbCurrency
   Date        vbDate
   Boolean     vbBoolean
   SCODE       vbError
   String      vbString
   Byte Array  vbArray + vbByte
				
Because user-defined types are not directly supported, you must make use of the byte-array data type in order to pass a user-defined type with the Winsock control. This article demonstrates how to send and receive data contained in a user-defined type with the Winsock Control.

MORE INFORMATION

The example uses the Winsock TCP client and server created in the following Microsoft Knowledge Base article:

152057 HOWTO: Create & Use a Client/Server Using Winsock TCP Controls

Prior to following this example, make sure you have at least built the framework for the client and server discussed in the aforementioned article. You will be required to make modifications to the DataArrival Event subroutine and the SendData Command subroutine.

Step by Step Example

  1. Enter the following code in the General declarations section of Form1 of both the client and server:
       Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (_
              hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    
       Private Type MyType
          i As Integer
          l As Long
          s As String * 8
          d As Double
       End Type
    						
  2. Enter the following code for the DataArrival Event subroutine in the Winsock server:
       Private Sub TCP1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
             Dim vta
             Dim mt As MyType
             Dim bt() As Byte
             TCP1(Index).GetData vta, vbArray + vbByte, LenB(mt)
             bt = vta
             CopyMemory mt, bt(0),  LenB(mt)
             Debug.Print mt.i; ","; mt.l; ","; mt.s; ","; mt.d
          End Sub
    						
  3. Enter the following code for the SendData Command button in the Winsock client:
       Private Sub cmdSendData_Click()
             Dim mt As MyType
             mt.i = 99
             mt.l = 33
             mt.s = "abcd"
             mt.d = 23.76
             Dim bt() As Byte
             ReDim bt(LenB(mt)) as Byte
             Dim vtdata As Variant
             CopyMemory bt(0), mt, LenB(mt)
             vtdata = bt
             TCP1.SendData vtdata
          End Sub
    						

Modification Type:MinorLast Reviewed:3/18/2005
Keywords:kbAPI kbnetwork kbWinsock KB152058