Click here to Skip to main content
Click here to Skip to main content

UDP Send and Receive using threads in VB.NET

By , 26 Nov 2004
Rate this:
Please Sign up or sign in to vote.

Introduction

When I first started with network programming I was unable to get a clean networking project without all the advanced stuff, that is why I'm submitting this. This article introduces how to use UDP/IP to send and receive data between two computers in a network. This also demonstrates the use of threads to send and receive data so that the user interface doesn't get stuck while sending and receiving data. In the receive program there is a cool section which converts the received message to bit format. That is also a simple technique which anybody can understand.

Anybody can use this program in a fair manner. And if you want to add more advanced features feel free to ask. I'm also going to submit a TCP/IP VC++.NET version of this program so that it may be more useful to you.

Background

This program uses UdpClient to send and receive data. This means that it uses the User Datagram Protocol to communicate. The main advantage of UDP is that it works three times faster than TCP. But beware if you are using an unreliable network, data loss can occur.

Using UDP

When using UDP in VB.NET you must first create a UdpClient like this. Make sure you import Imports System.Net.Sockets in the project:

Dim udpClient As New UdpClient

How to send

Dim GLOIP As IPAddress 
Dim GLOINTPORT As Integer 
Dim bytCommand As Byte() = New    Byte() {}

The variables declared above are used in the code below:

GLOIP = IPAddress.Parse(txtIP.Text)
GLOINTPORT = txtPort.Text
udpClient.Connect(GLOIP, GLOINTPORT)
bytCommand = Encoding.ASCII.GetBytes(txtMessage.Text)
pRet = udpClient.Send(bytCommand, bytCommand.Length)
Console.WriteLine("No of bytes send " & pRet)

First of all, we have to assign an IP address to the GLOIP variable. In VB.NET we use IPAddress.Parse(" ") to get the IP address from a String. Of course getting the port is as simple as assigning the value.

Then we use the UdpClient.Connect(hostname as String, port as integer) to connect.

Then comes the tricky part, converting the string message to the Byte() format. Once you do this, you just have to use the UdpClient.Send() method to send the data and it will pass an integer value indicating the number of bytes send.

How to receive

Public receivingUdpClient As UdpClient
Public RemoteIpEndPoint As New _
      System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
Public ThreadReceive As System.Threading.Thread
Dim SocketNO As Integer

The variables declared above are used in the code below:

SocketNO = txtSocket.Text
receivingUdpClient = New System.Net.Sockets.UdpClient(SocketNO)
ThreadReceive = _
   New System.Threading.Thread(AddressOf ReceiveMessages)
ThreadReceive.Start()

The above code is placed wherever you want to start the receive process. The code starts the thread to receive so that the interface doesn't get stuck by waiting for the receive. The thread assigns ReceiveMessage function to do the receive process.

Here is the basic coding in the ReceiveMessage function:

Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIpEndPoint)
txtIP.Text = RemoteIpEndPoint.Address.ToString
Dim BitDet As BitArray
BitDet = New BitArray(receiveBytes)
Dim strReturnData As String = _
            System.Text.Encoding.Unicode.GetString(receiveBytes)

This code receives the message. As you can see in the coding the IPEndPoint is configured so that it will receive from any IP address. The receiving port is assigned during the thread calling time.

This also demonstrates the conversion of Byte() to String so that you can do whatever you like with the received message.

How to get the bit details

For j = 0 To BitDet.Length - 1
    If BitDet(j) = True Then
        Console.Write("1 ")
        tempStr2 = tempStr
        tempStr = " 1" + tempStr2
    Else
        Console.Write("0 ")
        tempStr2 = tempStr
        tempStr = " 0" + tempStr2
    End If
    i += 1
    If i = 8 And j <= (BitDet.Length - 1) Then
        line += 1
        i = 0
        TextBox1.Text = TextBox1.Text + tempStr
        tempStr = ""
        tempStr2 = ""
        TextBox1.Text = TextBox1.Text + vbCrLf
        If j <> (BitDet.Length - 1) Then
            TextBox1.Text = TextBox1.Text + line.ToString & ") "
            Console.WriteLine()
        End If
    End If
Next

This simple code gets the message bit pattern and pastes it in a textbox. Make sure that the Multiline property of the text box is set to True.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Kumudu Gunasekara
Software Developer (Senior)
Sri Lanka Sri Lanka
I'm a software engineer working in a leading IT company in Sri Lanka. I'm a Microsoft Certified Technology Specialist. I used to submit articles that I taught would benefit fellow programmers. Unfortunately my last submission was more than 7 years ago. I'm thinking about starting again soon. Check out my full bio
My web site
Follow on   Twitter

Comments and Discussions

 
QuestionSource of the message PinmemberMember 1045558120-Mar-14 13:03 
QuestionSend working but receive isn't PinmemberHenry Ing-Simmons5-Aug-13 4:11 
AnswerRe: Send working but receive isn't PinmemberMember 901839314-Nov-13 6:37 
GeneralRe: Send working but receive isn't PinmemberGreg Criniti25-Jan-14 6:19 
QuestionBRAVO!!!! PinmemberDrikosRikos19-Jul-13 23:09 
QuestionIs this normal? PinmemberMember 1000503822-Apr-13 5:44 
QuestionCross Thread operation Not Valid Pinmemberyugastio30-Dec-12 12:37 
QuestionNot working ! Pinmemberayman.metwally@gizasystems.com26-Oct-12 1:02 
Questionport=11000 Pinmembersepide736927-May-12 1:06 
QuestionNot working PinmemberPeter Hawke28-Dec-11 16:06 
Questionbig time fail PinmemberMember 802528521-Jun-11 14:05 
nothing worked. the exact code is below (have i put the code on the wrong items? also, several of the lines had errors [which i fixed], but others only generate errors at runtime)
 
code:
 
Imports System.Net.Sockets
Imports System.Net
Imports System.Text
 
Public Class Form1
    'sending
    Dim udpClient As New UdpClient
    Dim GLOIP As IPAddress
    Dim GLOINTPORT As Integer
    Dim bytCommand As Byte() = New Byte() {}
    Dim pRet As String
 
    'receiving
    Public receivingUdpClient As UdpClient
    Public RemoteIpEndPoint As New  _
          System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
    Public ThreadReceive As System.Threading.Thread
    Dim SocketNO As Integer
   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        GLOIP = IPAddress.Parse(txtip.Text)
        GLOINTPORT = txtport.Text
        udpClient.Connect(GLOIP, GLOINTPORT)
        bytCommand = Encoding.ASCII.GetBytes(txtmessage.Text)
        pRet = udpClient.Send(bytCommand, bytCommand.Length)
        Console.WriteLine("No of bytes send " & pRet)
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIpEndPoint)
        txtip.Text = RemoteIpEndPoint.Address.ToString
        Dim BitDet As BitArray
        BitDet = New BitArray(receiveBytes)
        Dim strReturnData As String = _
                    System.Text.Encoding.Unicode.GetString(receiveBytes)
        RichTextBox1.Text = RichTextBox1.Text + ".... " + strReturnData
    End Sub
End Class
 

is that right? you should provide more details so we know what to do with the code. you can't just simply cut and paste and expect it to work. its just like if you type end in the textbox1.text_textchanged event handler, it will close the program when you type, not when you click close.
 
provide details including ALL imports, not just one. and the version of vb you use. I use Microsoft Visual Basic 2008 express edition. School uses Visual Basic 6. There's now Visual Basic 2010 Express (I prefer 2008, since it (and vb6) uses a syntax that i understand and know without learning again from scratch). please cut and paste ALL code from your program (including the class declarations), also provide control names and other properties. and tell us whether the code is a public procedure (you know, the Public sub procedureName() end sub )
Questionreceivev & retrive Ms access data by vb.net Pinmemberrakesh halale10-May-11 22:35 
GeneralMy vote of 5 PinmemberBayuBoy15-Sep-10 22:10 
GeneralGreate article Pinmembershaikhsamir8-May-10 22:14 
GeneralSample DEBUGGING PinmemberMember 383538724-Jan-10 7:05 
GeneralNot sending data to a static ip receiver PinmemberJack987324-Dec-09 0:06 
Questionhow to check?? Pinmemberdunk.azie29-Jul-09 17:58 
QuestionThreads PinmemberMember 461989517-Jun-09 16:09 
GeneralThis code! PinmemberMirosta150418-Nov-08 9:35 
GeneralRe: This code! Pinmembersusindran22-Apr-09 5:21 
GeneralRe: This code! Pinmembervishal108230-Apr-09 14:24 
GeneralGood article Pinmemberfindadvait3-Nov-08 22:38 
Generalclient server transfer in VB.net Pinmembersumit_87kumar1-Jun-08 17:25 
Questionhow to receive when receiver is behind router PinmemberMember 468623911-Feb-08 15:42 
QuestionASCII to Unicode conversion error? Pinmemberforcedfx1-Feb-08 7:06 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140421.2 | Last Updated 26 Nov 2004
Article Copyright 2004 by Kumudu Gunasekara
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid