00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#ifndef MN_OS_NET_UDPSERVERSOCKET_H
00025
#define MN_OS_NET_UDPSERVERSOCKET_H
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
#include <strings.h>
00037
#include <sys/uio.h>
00038
#include "MNSocket.h"
00039
#include "MNSelector.h"
00040
#include "MNThread.h"
00041
#include "MNMutex.h"
00042
#include "MNUDPSocket.h"
00043
#include "MNValid.h"
00044
00045
00046
00047
00048
00049
00050
#define IP_RECVDSTADDR 7
00051
00052
00053
00054
00055
00065 class MNUDPServerSocket :
public MNUDPSocket
00066 {
00067 DECLARE_VALID
00068
00069
public:
00070 class Interfaces
00071 {
00072
struct ifi_info* interf;
00073
00074
void delete_interf()
00075 {
00076
00077
00078
struct ifi_info* ifi;
00079
struct ifi_info* ifinext;
00080
00081
for (ifi = interf; ifi != NULL; ifi = ifinext)
00082 {
00083
if (ifi->ifi_addr != NULL) free(ifi->ifi_addr);
00084
if (ifi->ifi_brdaddr != NULL) free(ifi->ifi_brdaddr);
00085
if (ifi->ifi_dstaddr != NULL) free(ifi->ifi_dstaddr);
00086
00087
00088 ifinext = ifi->ifi_next;
00089
00090
00091 free(ifi);
00092 }
00093 interf = NULL;
00094 }
00095
00096
public:
00097 Interfaces ( )
00098 {
00099 interf = NULL;
00100 }
00101
00102 ~Interfaces ( )
00103 {
00104 delete_interf();
00105 }
00106
00107 struct ifi_info*
get_interf() {
00108
return interf;
00109 };
00110
00111 void set_interf(
struct ifi_info* ifi ) {
00112 delete_interf();
00113 interf = ifi;
00114 };
00115 };
00116
00117
private:
00118
class Dest
00119 {
00120
const char* destname;
00121
public:
00122
int destport;
00123
00124 Dest&
operator=(
const Dest& orig )
00125 {
00126 destname = strdup(orig.destname);
00127 destport = orig.destport;
00128
return *
this;
00129 }
00130
00131 Dest(
const Dest& orig )
00132 {
00133 destname = strdup(orig.destname);
00134 destport = orig.destport;
00135 }
00136
00137 Dest()
00138 {
00139 destname = NULL;
00140 destport = 0;
00141 }
00142
00143 Dest(
const char* name,
int port )
00144 : destport(port)
00145 {
00146 destname = strdup(name);
00147 }
00148 };
00149
struct Dest* _dest;
00150
00151
MNSelector& _selector;
00152
00153
00154
00155
00156
MNMutex _stopEntryLock;
00157
00158
typedef MNUDPSocket::CallbackSetting CBSetting;
00159
public:
00160
00161
00162
MNUDPServerSocket (
MNUDPServerSocket& orig );
00163
00164
MNUDPServerSocket (
MNSelector& sel,
00165 CBSetting cs );
00166
00167
MNUDPServerSocket (
MNSelector& sel,
00168
int fd,
00169
int zero,
00170 CBSetting cs );
00171
00172
MNUDPServerSocket (
MNSelector& sel,
00173
int port,
00174 CBSetting cs );
00175
00176
MNUDPServerSocket (
MNSelector& sel,
00177
int port,
00178
char* hostname,
00179 CBSetting cs );
00180
00181
MNUDPServerSocket (
MNSelector& sel,
00182
int port,
00183
char* hostname,
00184 Interfaces* intf );
00185
00186
MNUDPServerSocket (
MNSelector& sel,
00187
MNSocket& orig,
00188 CBSetting cs = MNUDPSocket::IovecMode,
00189
int copyflags = MNSocket::TakeoverFlag );
00190
virtual ~MNUDPServerSocket ( );
00191
00192
virtual void activate();
00193
00194
void stopUdpServer();
00195
00199
MNSelector&
getSelector( );
00200
00201
int mc_join_all(
int port,
const char* hostname, Interfaces* intf);
00202
int mc_leave_all(
int sockfd,
struct sockaddr *sock_addr, Interfaces* intf);
00203 };
00204
00205
#endif
00206
00207