devxlogo

Winsock Programming

Winsock Programming

Most of you might have worked withInternet Transfer Control which is very handy control when it comes to InternetProgramming but there is another control which even more robust and helpsprogrammers creating more flexible applications. Winsock control comes with VB6and is used to create applications that access the low-level functions of theTransmission Control Protocol/Internet Protocol (TCP/IP).

TCP/IP is a specification that defines aseries of protocols used to standardize how computers exchange information witheach other. TCP/IP provides communication across interconnected networks thatuse diverse hardware architectures and various operating systems. The protocolsin TCP/IP are arranged in a series of layers known as a protocol stack. Eachlayer has its own functionality.

Winsock is a standard that is maintainedby Microsoft. This standard is basically a set of routines that describecommunications to and from the TCP/IP stack. These routines reside in a dynamiclink library that runs under Windows. The winsock DLL is interfaced with TCP/IPand from there through the Internet.

In this article, I am going to show how touse the winsock in a client server environment, we will create two separateapplications, one of which will be a server and the other will be a client. Bothclient and server will interact with each other to exchange data. Client willsend a request to the server and the server which will be connected to adatabase will retrieve the information requested by the client from the databaseand will return the requested information back to the client. You will adatabase with this article, the database contains the item numbers and theirprices. In real life situations, database might be located on a machinedifferent from the one that hosts the client application.

I think it would be better to talk aboutthe ports before we proceed any further. A port is a special memory locationthat exists when two computers are in communication via TCP/IP. Applications usea port number as an identifier to other computers, both the sending andreceiving computers use this port to exchange data.

To make the job of communication easier,some port numbers have been standardized. These standard port numbers have noinherent value other than that users have agreed to use them with certainapplications. Table below lists a number of popular and publicly accepted portnumbers and their corresponding applications.

Service

Port

HTTP

80

FTP

20,21

Gopher

70

SMTP

25

POP3

110

Telnet

23

Finger

79

Local loops/callbacks

0

Using the Winsock Control

Winsock is above the TCP/IP protocol stack in the ISO/OSImodel. TCP/IP is an industry standard communication protocol that definesmethods for packaging data into packets for transmission between computingdevices on a heterogeneous network. TCP/IP is the standard for data transmissionover networks, including the Internet. TCP establishes a connection for datatransmission and IP defines the method for sending data packets.

The Microsoft Winsock control makes using the TCP/IP abreeze. Microsoft has wrapped up the Winsock and INetAPI API calls into a niceneat package that you can easily incorporate into your Visual Basicapplications.

Winsock Operating Modes

The Transport layer (also known as the Host-to-Host Transportlayer) is responsible for providing the Application layer with session anddatagram communication services. The core protocols of the Transport layer areTCP and User Datagram Protocol (UDP). The Winsock control supports the followingtwo operating modes:

  • sckTCPProtocol
  • sckUDPProtocol

Winsock Properties

Winsock enables you to create clients and servers using thesame control. This dual functionality enables you to specify through propertysetting the type of application you will be building. The Winsock control uses anumber of the same properties, whether you are creating client or a server,thereby all but eliminating the learning curve needed to create applications.Some of the important properties of the control are as following:

BytesReceived Property

This property returns the number of bytes currently in thereceive buffer. This is a read-only property and is unavailable at design time.The value returned is a long integer.

LocalHostName Property

The LocalHostName property returns the name of the local hostsystem. This is read-only property and is unavailable at the design time. Thevalue returned is a string.

LocalIP Property

The LocalIP property returns the local host system IP addressin the form of a string, such as 11.0.0.127. This property is read-only and isunavailable at design time.

LocalPort Property

This property returns or sets the local port number. This canbe both read from and written to and is available at both design time andruntime. The value returned is a long integer.

Protocol Property

Returns or sets the protocol, either TCP or UDP, used by theWinsock control.

RemoteHost Property

The RemoteHost property returns or sets the remote host. Thiscan be both read from and written to and is available both in design time andruntime. The value returned is a string and can be specified either as an IPaddress or as a DNS name.

RemotePort Property

This property returns or sets the remote port number.

State Property

This returns the state of the control as expressed by anenumerated list. This is read-only property and is unavailable at design time.

Some of the important methods of Winsock control are asfollowing:

Accept Method

It accepts the request for connection from the client system.For this method to be used, the control must be in the listening state.

Close Method

The Close method terminates a TCP connection from either theclient or server applications.

GetData Method

GetData is the method that retrieves the current block ofdata from the buffer and then stores it in a variable of the variant type.

PeekData Method

The PeekData method operates in a fashion similar to theGetData method. However, it does not remove data from the input queue.

Listen Method

This is invoked on the server application to have the serverapplication wait for a TCP request for connection from a client system.

SendData Method

This method dispatches data to the remote computer. It isused for both the client and server systems.

Connect Method

The Connect method requests a connection to a remotecomputer.

I am not going to discuss events here. You can find thecomplete details of events on the Microsoft site (http://www.microsoft.com).

In the sample provided with this article, we are going tocreate two applications, one server and client. This is a real world example,where the clients requests some information from the server and the serverretrieves some specific information from the database and sends the retrievedinformation back to the client. The database used in the sample is also providedwith the code. The database name is Prices.mdb. This is a small databasecomprising of a single table containing two fields. The fields are item numberand price. The clients sends the item number to the server and the serverretrieves the price against that item number from the database and sends it backto the client. One of the current trends in software development today is theissue of thick clients versus thin clients. A thick client is basically anapplication that performs the bulk of the processing on the individual clientPC, whereas a thin client performs the processing on the server.

Creating the Client

Follow the steps shown below:

  1. Start a new EXE project.

  2. Add a Winsock control to your application.

  3. Add all the controls to the form (See the application for details).

Here is the complete code:

Option Explicit
Private Sub cmdClose_Click()
Winsock1.Close
shpGo.Visible = False
shpWait.Visible = False
shpError.Visible = True
End Sub
Private Sub cmdConnect_Click()
Winsock1.RemoteHost = "11.0.0.1" 'Change this to your host ip
Winsock1.RemotePort = 1007
Winsock1.Connect
shpGo.Visible = True
txtItem.SetFocus
End Sub
Private Sub cmdSend_Click()
If Winsock1.State = sckConnected Then
Winsock1.SendData txtItem.Text
shpGo.Visible = True
Label3.Caption = "Sending Data"
Else
shpGo.Visible = False
shpWait.Visible = False
shpError.Visible = True
Label3.Caption = "Not currently connected to host"
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
Winsock1.GetData sData, vbString
'Label1.Caption = sData
txtPrice.Text = sData
Label3.Caption = "Received Data"
shpGo.Visible = True
shpWait.Visible = False
shpError.Visible = False
End Sub
Private Sub Winsock1_SendComplete()
Label3.Caption = "Completed Data Transmission"
End Sub

Creating the Server

The server portion of the price lookup example is designed toaccept the item number sent from the client and look up the associated price ina database. The server than sends the information back to the client. There isfile named as “path.txt” in the folder called as “server”. Locate thatfile and change the database path in the file to the location where the databaseis located on your machine. The connection to the database is made in theDataArrival event of the Winsock control. The following code segment opens thedatabase and finds the first occurrence of the value in sItemData. When therecord is found, the value contained in the price field is sent back to theclient.

' Get clients request from database
strData = "Item = '" & sItemData & "'"
rs.Open "select * from prices", strConnect, adOpenKeyset, adLockOptimistic
rs.Find strData
strOutData = rs.Fields("Price")

Follow the steps shown below to create the server:

  1. Start a new Standard EXE in VB.

  2. Add the Winsock control to your application.

  3. Add the controls to the form as shown in the accompanying code (See the folder named as “server”).

Here is the complete code:

Option Explicit
Dim iSockets As Integer
Dim sServerMsg As String
Dim sRequestID As String
 
Private Sub Form_Load()
Form1.Show
lblHostID.Caption = Socket(0).LocalHostName
lblAddress.Caption = Socket(0).LocalIP
Socket(0).LocalPort = 1007
sServerMsg = "Listening to port: " & Socket(0).LocalPort
List1.AddItem (sServerMsg)
Socket(0).Listen
End Sub
Private Sub socket_Close(Index As Integer)
sServerMsg = "Connection closed: " & Socket(Index).RemoteHostIP
List1.AddItem (sServerMsg)
Socket(Index).Close
Unload Socket(Index)
iSockets = iSockets - 1
lblConnections.Caption = iSockets
 
End Sub
Private Sub socket_ConnectionRequest(Index As Integer, ByVal requestID As Long)
sServerMsg = "Connection request id " & requestID & " from " & Socket(Index).RemoteHostIP
If Index = 0 Then
List1.AddItem (sServerMsg)
sRequestID = requestID
iSockets = iSockets + 1
lblConnections.Caption = iSockets
Load Socket(iSockets)
Socket(iSockets).LocalPort = 1007
Socket(iSockets).Accept requestID
End If
End Sub
Private Sub socket_DataArrival(Index As Integer, ByVal bytesTotal As Long)
 
Dim sItemData As String
Dim strData As String
Dim strOutData As String
Dim strConnect As String
 
 
' get data from client
Socket(Index).GetData sItemData, vbString
sServerMsg = "Received: " & sItemData & " from " & Socket(Index).RemoteHostIP & "(" & sRequestID & ")"
List1.AddItem (sServerMsg)
 
'strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:.mdb;Persist Security Info=False"
Dim strPath As String
 
'Change the database path in the text file
 
Dim fso As New FileSystemObject, txtfile, _
fil1 As File, ts As TextStream
Set fil1 = fso.GetFile("path.txt")
' Read the contents of the file.
Set ts = fil1.OpenAsTextStream(ForReading)
strPath = ts.ReadLine
ts.Close
Set fso = Nothing
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;Data Source=" & strPath & _
"; Mode=Read|Write"
 
Dim rs As New ADODB.Recordset
 
' Get clients request from database
strData = "Item = '" & sItemData & "'"
 
rs.Open "select * from prices", strConnect, adOpenKeyset, adLockOptimistic
rs.Find strData
strOutData = rs.Fields("Price")
 
'send data to client
sServerMsg = "Sending: " & strOutData & " to " & Socket(Index).RemoteHostIP
List1.AddItem (sServerMsg)
Socket(Index).SendData strOutData
 
End Sub

Running the example

  1. Create executable for both the applications.

  2. Launch both the applications.

  3. Click the Connect button.

  4. Enter a value from 0 to 6 (currently the database contains only six records, error handling is not done in this code, you can add the error handling yourself) and click the Lookup button. The associated price will be displayed in the price field.


Client


Server

devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist