Click here to Skip to main content
11,922,641 members (56,280 online)
Click here to Skip to main content
Add your own
alternative version


58 bookmarked

TinyUDP - Simple UDP Client/Server Components for .NET

, 7 Jun 2005
Rate this:
Please Sign up or sign in to vote.
Simple UDP client/server components for .NET 1.1.


This article was written in the course of implementing a simple method for a Windows service to communicate status information to a front-end administration application. This article was written using the excellent article UDP send and receive using threads in VB.NET by Kumudu Gunasekara for inspiration and 'spiritual guidance', as well as some nifty ideas. Kumudu's article is definitely worth reading.


I decided to implement a simple UDP client/server system for simple communication between my Windows service and the administration program for a variety of reasons:

  1. UDP is lightweight and fast compared to other protocols, such as TCP. This was important to me, as my Windows service needed to maintain high performance.
  2. UDP is connectionless, which means that it can fire off a message and immediately free server-side network resources. Incidentally, this also makes UDP one of the easiest protocols to write a client/server application for.
  3. UDP preserves message boundaries transmitting entire messages at once.

Some of the drawbacks of UDP are:

  1. UDP does not guarantee delivery or provide for acknowledgment of receipt of messages. In this instance, that was perfectly acceptable since I was simply passing the status data from the Windows service to the UI layer.
  2. UDP has practical limits on how much data can be sent in a single message - usually limited to 1500 Bytes per message or less. Again, this limitation worked well given my scenario - I would normally not be passing more than 100 bytes per message.

Using the code

The code is pretty straightforward and well documented. There are two components: Tiny.UDP.TinyServer and Tiny.UDP.TinyClient. They are .NET 1.1 components, so they can be added to your Toolbox and dropped right in your Windows Forms; or you can reference them (as I did in the sample applications) by creating objects in the code. The code to create a server looks like this:

' Initialize a TinyServer Object
Dim server As New TinyServer

' Set it for UDP and assign the destination end point
server.Protocol = ProtocolType.Udp
server.ClientAddress = IPAddress.Parse("")
server.ClientPort = 8088

' Set the Encoding Type and Send the Message
server.Encode = EncodingType.ASCII

All we're doing here is:

  1. Creating the TinyServer object.
  2. Setting the communications protocol (currently only UDP is supported), client IP address and client port.
  3. And finally, setting the message encoding type (ASCII, UNICODE, UTF7, UTF8 and all others are supported).

Next we set up the TinyClient:

' Define a TinyClient object
Dim WithEvents client As TinyClient

' Create a client object
client = New TinyClient

' Set the inbound client port
client.ClientPort = 8088

' Set the encoding type and protocol
client.Encode = EncodingType.ASCII
client.Protocol = ProtocolType.Udp

Again, it's a simple matter to set up a client:

  1. Define and create a new TinyClient object. Notice it is declared WithEvents.
  2. Set the inbound client port number.
  3. Set the encoding type and protocol to match the TinyServer that we created.

That's a simple UDP client and server with just 10 lines of code! (Not counting comments of course.) Finally, we start the client running with the Start() method:


and send messages from the server with the SendMessage() method:

server.SendMessage ("This is a UDP Message sent by TinyServer.")

The TinyClient object was declared WithEvents because it implements two events: BeforeReceive and AfterReceive. BeforeReceive is fired immediately before receiving data off the wire. AfterReceive is fired immediately after the client finishes receiving data. You can set up your own subroutines to handle these events as you see fit. Other events may be added later; but for now I decided those two were the most important to get implemented.

How does it work?

If you look into the code, you will see that the TinyServer simply creates a System.Net.Sockets.UdpClient, opens a connection, and fires off your message when you call the SendMessage() method. Very simple. The client is where the fun begins.

On the client side, the Start() method actually fires off a worker thread that in turn starts its own System.Net.Sockets.UdpClient and waits for data. We set it off on a separate worker thread because the Receive() method blocks the current thread until it completes - and we don't need it locking up our UI. Once a message is received by the worker thread, the thread exits immediately, so we start a new worker thread to continue waiting for the next message.

Because these events are fired from the worker thread, you'll notice in the sample program that I check Me.InvokeRequired on the client form before I update it. This is necessary because of the nature of multi-threaded apps; never update the UI from a worker thread, always check InvokeRequired and use Invoke if it is True.

Finally, when we finish, fire the client.Stop() method to stop the worker thread and cleanly dispose off the UDPClient.

Points of interest

As mentioned previously, this works best on a local machine or on locally networked computers; for instance, when communicating non-critical information between layers of a locally installed application. It also has the potential for chat applications, which I'm sure has been done to death by now Smile | :) My main goal in designing this was to create a reusable, lightweight set of components that could be used to allow Windows services to easily communicate with the front-end client applications without jumping through hoops.



  • June 8th, 2005 - version 0.8.


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

Web Developer
United States United States
Database Admin (MCDBA) and Programmer with 15+ years' experience in data warehousing, application design and development, and systems integration.

You may also be interested in...

Comments and Discussions

QuestionColls Pin
Nattawutxp11-Sep-14 23:27
memberNattawutxp11-Sep-14 23:27 
QuestionClient Receiving Blank Message Pin
Member 977465013-Jul-13 14:09
memberMember 977465013-Jul-13 14:09 
Generalany trouble with VS2010 ?? Pin
SpaceWalker5-Jul-12 3:14
memberSpaceWalker5-Jul-12 3:14 
GeneralRe: any trouble with VS2010 ?? Pin
manekurt4-Sep-12 13:52
membermanekurt4-Sep-12 13:52 
QuestionCan't receive message Pin
Al Najjar21-Dec-11 16:14
memberAl Najjar21-Dec-11 16:14 
AnswerRe: Can't receive message Pin
Filip Mestric2-Feb-12 10:55
memberFilip Mestric2-Feb-12 10:55 
GeneralRe: Can't receive message Pin
SpaceWalker6-Jul-12 7:16
memberSpaceWalker6-Jul-12 7:16 
Questionmake receiver in Pin
davismu1-Jul-11 20:54
memberdavismu1-Jul-11 20:54 
Generalwhen to call the InitializeThread() Pin
KHelmi2-Jun-10 10:00
memberKHelmi2-Jun-10 10:00 
GeneralRe: when to call the InitializeThread() Pin
Member 84109234-Feb-13 12:35
memberMember 84109234-Feb-13 12:35 
QuestionWhat kind of license has this code? Pin
unican9-Dec-08 11:36
memberunican9-Dec-08 11:36 
Questionhow to receive msg when receiver is behind router Pin
Member 468623911-Feb-08 17:09
memberMember 468623911-Feb-08 17:09 
GeneralTinyUDP seriously flawed Pin
marantz14-Nov-07 7:41
membermarantz14-Nov-07 7:41 
Generaludp socket to accept data and write it to a db Pin
daver564-Jul-07 5:18
memberdaver564-Jul-07 5:18 
GeneralUDP over GPRS (push to client) Pin
djgann17-Apr-07 13:33
memberdjgann17-Apr-07 13:33 
GeneralRe: UDP over GPRS (push to client) Pin
Member 292441819-Mar-09 18:15
memberMember 292441819-Mar-09 18:15 
GeneralThanks for the complements Pin
Kumudu Gunasekara24-Mar-07 18:32
memberKumudu Gunasekara24-Mar-07 18:32 
GeneralI need a source code that view installed applications and run them. Pin
MjRazzaghi2-Jan-07 5:22
memberMjRazzaghi2-Jan-07 5:22 
Questionhelp Pin
Gigi Carlino26-Oct-06 7:14
memberGigi Carlino26-Oct-06 7:14 
GeneralHelp ... Create new Form from worker thread Pin 0:26 0:26 
GeneralMemory Usage in Task Manager Pin
brembot2-Aug-06 6:41
memberbrembot2-Aug-06 6:41 
Fulmine23-Jan-06 5:50
memberFulmine23-Jan-06 5:50 
GeneralProgram not closing; tried lots of things... Pin
daniellus3-Jan-06 13:29
memberdaniellus3-Jan-06 13:29 
GeneralRe: Program not closing; tried lots of things... Pin
NairbNilpop1-Feb-06 17:30
memberNairbNilpop1-Feb-06 17:30 
The problem is that _data = _UDPClient.Receive(_Server) does not 'unblock' when _ThreadReceive.Abort() is called.   My solution (look for the code between '***BKP Start and '***BKP End):
         Public Sub [Stop]()
            ' Close the UDPClient and stop the worker thread
                  ' Suspend the thread and then abort it.   Keeps it from
                  ' continuing to try to process anything further while
                  ' it winds down.

                  '***BKP Start
                  '***BKP End
                  If Not (_UDPClient Is Nothing) Then
                     ' Close the UDPClient and then force it to Nothing
                     _UDPClient = Nothing
                  End If
            Catch ex As Exception
                  Throw ex
            End Try
         End Sub
This will cause _UDPClient.Receive(_Server) to throw a with error code 10004. So you'll have to change Public Sub Receive() to handle it how you wish.   Here is my solution (I'm not real happy about the return in the catch block, but hey it's a quick fix):
         Public Sub Receive()

'Existing code

                  Select Case Protocol
                     Case ProtocolType.Udp
                           _data = _UDPClient.Receive(_Server)
                           _BytesReceived = _data.Length
                     Case Else
                           Throw New ProtocolNotSupportedException
                  End Select
                  '***BKP Start
            Catch socketEx As System.Net.Sockets.SocketException
                  If socketEx.ErrorCode <> 10004 Then
                     Throw socketEx
                  End If
                  '***BKP End
            Catch ex As Exception
                  Throw ex

GeneralRe: Program not closing; tried lots of things... Pin
awdrgftdesq19-Sep-06 6:32
memberawdrgftdesq19-Sep-06 6:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    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 | Terms of Use | Mobile
Web02 | 2.8.151125.1 | Last Updated 8 Jun 2005
Article Copyright 2005 by tupacs01
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid