UDP is a packet oriented network protocol (technically the '''U'''ser '''D'''atagram '''P'''rotocol; datagrams are an older name for packets). This is the datagram partner to the stream oriented [TCP]. UDP is often called "unreliable". This only means that the user is responsible for handling dropped or corrupted packets. UDP is often used when the loss of a packet is relativlely harmless. An example might be a "You have mail" server that sends UDP packets every 30 seconds when there is unread mail. When you find yourself adding code to account for dropped or corrupted packets or packets arriving out of order, it is a sure sign that you should be using TCP in the first place. The Tcl core has supported TCP sockets with the [socket] command since version 7 or so but UDP must be supplied by an extension. The following extensions provide UDP support: * [TclUDP] - This is the normal package for standard UDP client/server programs * [Tcl-dp] - A extensive TCP/IP package which also supports UDP * [Scotty] - An SNMP package with its own UDP implementation * [pktsrc] - Access to raw IP Datagram and thus to UDP The TclUDP package is quite simple to use. It has only two commands to create and configure udp sockets. There is no 'recv' or 'send', rather, you read from a TclUDP socket with 'read' and write to it using 'puts'. The TclUDP package supports UDP sockets on Windows and Unix with fileevent handling and has recently been enhanced to support the TEA2 build system and to enable the transmission of binary data. It is now a project at [sourceforge] [http://sourceforge.net/projects/tcludp] and the lastest releases will be available at [http://prdownloads.sourceforge.net/tcludp/] Also http://students.cs.tamu.edu/mmiller/tcl/channel.html which is the original base for tcludp. UDP is often called "unreliable". This only means that the user is responsible for handling dropped or corrupted packets. UDP is often used when the loss of a packet is ---- [PT] 13-Jun-2003: This is a simple demo server that I use in testing: package require udp proc udpEventHandler {sock} { set pkt [read $sock] set peer [udp_conf $sock -peer] puts "$peer: [string length $pkt] {$pkt}" return } proc udp_listen {port} { set srv [udp_open $port] fconfigure $srv -buffering none -translation binary fileevent $srv readable [list ::udpEventHandler $srv] puts "Listening on udp port: [udp_conf $srv -myport]" return $srv } if {$tcl_interactive} { puts "call udp_listen portnum to begin" } else { eval [list udp_listen] $argv vwait forever } And a corresponding server socket can be obtained using: proc udp_create {host port} { set s [udp_open] udp_conf $s $host $port fconfigure $s -buffering none -translation binary return $s } then use set sock [udp_create $server $portnum];# eg localhost 9876 puts -nonewline $sock "MyData - including binary \0\1\2\3" ---- 30-Jan-2003 [Mike Tuxford] It was mentioned in c.l.t that there aren't many examples of tcludp usage around so I'll add this simple one that listens on port 1434 which is the MSSQL port and has been in the news a lot lately due to major exploits. package require udp proc udpEventHandler {} { global fd puts "event triggered..." puts "Data: [gets $fd(udp)]" puts "Peer: [udp_conf $fd(udp) -peer]" return } set fd(udp) [udp_open 1434] fileevent $fd(udp) readable udpEventHandler puts "Listening on udp port: [udp_conf $fd(udp) -myport]" vwait __forever__ ---- 10-Dec-2003 [Shedi] Wake On Lan Example (the magic packet). Usage: WakeOnLan 10.255.255.255 000783104R83 package require udp proc WakeOnLan {broadcastAddr macAddr} { set net [binary format H* [join [split $macAddr -:] ""]] set pkt [binary format c* {0xff 0xff 0xff 0xff 0xff 0xff}] for {set i 0} {$i < 16} {incr i} { append pkt $net } # Open UDP and Send the Magic Paket. set udpSock [udp_open]; udp_conf $udpSock $broadcastAddr 4580; fconfigure $udpSock -translation binary; puts $udpSock $pkt flush $udpSock; close $udpSock } ---- '''UDP enabled packages''' In [tcllib] - the [dns] package is capable of using udp if available. Also the forthcoming [time] and [ntp] packages. [[[PT]]] ---- [[ [Category Internet] ]]