Click here to Skip to main content
6,292,426 members and growing! (10,827 online)
Email Password   helpLost your password?
General Programming » Internet / Network » Internet     Intermediate

TinyUDP - Simple UDP Client/Server Components for .NET

By tupacs01

Simple UDP client/server components for .NET 1.1.
VB.NET 1.1, Win2K, WinXP, Win2003, WinForms, VS.NET2003, Dev
Posted:7 Jun 2005
Views:112,238
Bookmarked:44 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
16 votes for this article.
Popularity: 4.99 Rating: 4.14 out of 5
1 vote, 6.3%
1
1 vote, 6.3%
2
1 vote, 6.3%
3
3 votes, 18.8%
4
10 votes, 62.5%
5

Introduction

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.

Background

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("127.0.0.1")
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:

client.Start()

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 :) 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.

Enjoy!

History

  • June 8th, 2005 - version 0.8.

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

tupacs01


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

Other popular Internet / Network articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 44 (Total in Forum: 44) (Refresh)FirstPrevNext
GeneralWhat kind of license has this code? Pinmemberunican11:36 9 Dec '08  
Generalhow to receive msg when receiver is behind router PinmemberMember 468623917:09 11 Feb '08  
GeneralTinyUDP seriously flawed Pinmembermarantz7:41 14 Nov '07  
Generaludp socket to accept data and write it to a db Pinmemberdaver565:18 4 Jul '07  
GeneralUDP over GPRS (push to client) Pinmemberdjgann13:33 17 Apr '07  
GeneralRe: UDP over GPRS (push to client) PinmemberMember 292441818:15 19 Mar '09  
GeneralThanks for the complements PinmemberKumudu Gunasekara18:32 24 Mar '07  
GeneralI need a source code that view installed applications and run them. PinmemberMjRazzaghi5:22 2 Jan '07  
Questionhelp PinmemberGigi Carlino7:14 26 Oct '06  
GeneralHelp ... Create new Form from worker thread Pinmemberryan@theglenns.co.za0:26 20 Sep '06  
GeneralMemory Usage in Task Manager Pinmemberbrembot6:41 2 Aug '06  
GeneralHELP I NEED A GOOD UDP SOURCE PinmemberFulmine5:50 23 Jan '06  
GeneralProgram not closing; tried lots of things... Pinmemberdaniellus13:29 3 Jan '06  
GeneralRe: Program not closing; tried lots of things... PinmemberNairbNilpop17:30 1 Feb '06  
GeneralRe: Program not closing; tried lots of things... Pinmemberawdrgftdesq6:32 19 Sep '06  
GeneralMultithreading start/stop question Pinmemberdavidm9911:09 1 Dec '05  
QuestionInvoke PinmemberLost-Ha[n]f-PHP2:31 24 Nov '05  
AnswerRe: Invoke Pinmembertupacs014:36 28 Nov '05  
GeneralConfusing naming convention Pinmembermeraydin11:25 15 Nov '05  
GeneralRe: Confusing naming convention Pinmembertupacs014:40 28 Nov '05  
GeneralRe: Fix for naming convention and exit bug PinmemberDanilo Corallo22:45 20 Feb '07  
GeneralProgram Continues To Run After Close PinmemberDuckdoo4:57 14 Nov '05  
GeneralRe: Program Continues To Run After Close Pinmemberdavidm9910:57 15 Nov '05  
GeneralRe: Program Continues To Run After Close Pinmembertupacs014:58 28 Nov '05  
GeneralSetting Origin Port Pinmemberdavidm9912:04 8 Nov '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 7 Jun 2005
Editor: Rinish Biju
Copyright 2005 by tupacs01
Everything else Copyright © CodeProject, 1999-2009
Web16 | Advertise on the Code Project