September 28, 2005
------------------

Compared to the previous official snapshot (November 2004) the 
current version of oscpack includes a re-written set of network 
classes and some changes to the syntax of the networking code. It no 
longer uses threads, which means that you don't need to use sleep() 
if you are writing a simple single-threaded server, or you need to 
spawn your own threads in a more complex application.

The list below summarises the changes if you are porting code from 
the previous release.

    - there are no longer any threads in oscpack. if you need to 
    set up an asynchronous listener you can create your own thread 
    and call Run on an instance of SocketReceiveMultiplexer or 
    UdpListeningReceiveSocket (see ip/UdpSocket.h) yourself.
    
    - host byte order is now used for network (IP) addresses
        
    - functions which used to take two parameters <address, port> 
    now take an instance of IpEndpointName (see 
    ip/IpEndpointName.h) this class has a number of convenient 
    constructors for converting numbers and strings to internet 
    addresses. For example there is one which takes a string and 
    another that take the dotted address components as separate 
    parameters.
    
    - The UdpTransmitPort class, formerly in UdpTransmitPort.h, is 
    now called UdpTransmitSocket, which is simply a convenience 
    class derived from UdpSocket (see ip/UdpSocket.h). Where you 
    used to use the constructor UdpTransmitPort( address, port) now 
    you can use UdpTransmitSocket( IpEndpointName( address, port ) 
    ) or you can any of the other possible ctors to IpEndpointName
    () (see above). The Send() method is unchanged.
    
    - The packet listener base class is now located in 
    ip/PacketListener.h instead of PacketListenerPort.h. The 
    ProcessPacket method now has an additional parameter indicating 
    the remote endpoint
    
    - The preferred way to set up listeners is with 
    SocketReceiveMultiplexer (in ip/UdpSocket.h), this also allows 
    attaching periodic timers. For simple applications which only 
    listen to a single socket with no timers you can use 
    UdpListeningReceiveSocket (also in UdpSocket.h) See 
    osc/OscReceiveTest.cpp or osc/OscDump.cpp for examples of this. 
    This is more or less equivalent to the UdpPacketListenerPort 
    object in the old oscpack versions except that you need to 
    explicitly call Run() before it will start receiving packets 
    and it runs in the same thread, not a separate thread so Run() 
    won't usually return.
    
    - Explicit calls to InitializeNetworking() and 
    TerminateNetworking() are no longer required for simple 
    applications (more complex windows applications should 
    instantiate NetworkInitializer in main() or WinMain (see 
    ip/NetworkingUtils.h/.cpp)
    
    - The OscPacketListener base class (OscPacketListener.h) was 
    added to make traversing OSC packets easier, it handles bundle 
    traversal automatically so you only need to process messages in 
    your derived classes.
    
    - On Windows be sure to link with ws2_32.lib or you will see
    a linker error about WSAEventSelect not being found. Also you 
    will need to link with winmm.lib for timeGetTime()

