Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef INCLUDED_UDPSOCKET_H
00031 #define INCLUDED_UDPSOCKET_H
00032
00033 #ifndef INCLUDED_NETWORKINGUTILITIES_H
00034 #include "NetworkingUtils.h"
00035 #endif
00036
00037 #ifndef INCLUDED_IPENDPOINTNAME_H
00038 #include "IpEndpointName.h"
00039 #endif
00040
00041
00042 class PacketListener;
00043 class TimerListener;
00044
00045 class UdpSocket;
00046
00047 class SocketReceiveMultiplexer
00048 {
00049 class Implementation;
00050 Implementation *impl_;
00051
00052 friend class UdpSocket;
00053
00054 public:
00055 SocketReceiveMultiplexer();
00056 ~SocketReceiveMultiplexer();
00057
00058
00059
00060
00061 void AttachSocketListener( UdpSocket *socket, PacketListener *listener );
00062 void DetachSocketListener( UdpSocket *socket, PacketListener *listener );
00063
00064 void AttachPeriodicTimerListener( int periodMilliseconds, TimerListener *listener );
00065 void AttachPeriodicTimerListener(
00066 int initialDelayMilliseconds, int periodMilliseconds, TimerListener *listener );
00067 void DetachPeriodicTimerListener( TimerListener *listener );
00068
00069 void Run();
00070 void RunUntilSigInt();
00071 void Break();
00072 void AsynchronousBreak();
00073 };
00074
00075
00076 class UdpSocket{
00077 class Implementation;
00078 Implementation *impl_;
00079
00080 friend class SocketReceiveMultiplexer::Implementation;
00081
00082 public:
00083
00084
00085
00086 UdpSocket();
00087 virtual ~UdpSocket();
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 IpEndpointName LocalEndpointFor( const IpEndpointName& remoteEndpoint ) const;
00098
00099
00100
00101 void Connect( const IpEndpointName& remoteEndpoint );
00102 void Send( const char *data, int size );
00103 void SendTo( const IpEndpointName& remoteEndpoint, const char *data, int size );
00104
00105
00106
00107
00108 void Bind( const IpEndpointName& localEndpoint );
00109 bool IsBound() const;
00110
00111 int ReceiveFrom( IpEndpointName& remoteEndpoint, char *data, int size );
00112 };
00113
00114
00115
00116
00117
00118
00119
00120 class UdpTransmitSocket : public UdpSocket{
00121 public:
00122 UdpTransmitSocket( const IpEndpointName& remoteEndpoint )
00123 { Connect( remoteEndpoint ); }
00124 };
00125
00126
00127 class UdpReceiveSocket : public UdpSocket
00128 {
00129 public:
00130 UdpReceiveSocket( const IpEndpointName& localEndpoint )
00131 { Bind( localEndpoint ); }
00132 };
00133
00134
00135
00136
00137
00138 class UdpListeningReceiveSocket : public UdpSocket{
00139 SocketReceiveMultiplexer mux_;
00140 PacketListener *listener_;
00141 public:
00142 UdpListeningReceiveSocket( const IpEndpointName& localEndpoint, PacketListener *listener )
00143 : listener_( listener )
00144 {
00145 Bind( localEndpoint );
00146 mux_.AttachSocketListener( this, listener_ );
00147 }
00148
00149 ~UdpListeningReceiveSocket()
00150 { mux_.DetachSocketListener( this, listener_ ); }
00151
00152
00153 void Run() { mux_.Run(); }
00154 void RunUntilSigInt() { mux_.RunUntilSigInt(); }
00155 void Break() { mux_.Break(); }
00156 void AsynchronousBreak() { mux_.AsynchronousBreak(); }
00157 };
00158
00159
00160 #endif