00001 #ifndef COMMON_H
00002 #define COMMON_H
00003
00004 #define MAX_HOSTNAME_LENGTH 256
00005 #define MAC_ADDR_LENGTH 6
00006 #define MAX_HEADER_SIZE 256
00007 #define DEFAULT_SEND_PORT 3000
00008 #define DEFAULT_RECV_PORT 4000
00009 #define MAXBUFLENGTH 10000
00010 #define MTU_SIZE 1500
00011
00012 #include <string.h>
00013 #include <sys/socket.h>
00014 #include <sys/types.h>
00015 #include <unistd.h>
00016 #include <netinet/in.h>
00017 #include <netdb.h>
00018 #include <arpa/inet.h>
00019 #include <cstdlib>
00020 #include <ctime>
00021
00022 #ifndef INADDR_NONE
00023 # define INADDR_NONE (-1)
00024 #endif
00025
00026
00028
00042 class PacketHdr{
00043
00044 public:
00045 PacketHdr();
00049 inline void init(){memset(info_,0,MAX_HEADER_SIZE );}
00053 short getShortIntegerInfo(int position);
00057 int getIntegerInfo(int position);
00061 inline unsigned char* accessInfo(){return info_;}
00065 inline int getSize() { return length_; }
00069 void setIntegerInfo(int a, int position);
00073 void setShortIntegerInfo(short b, int position);
00077 inline void setOctet( unsigned char c, int position){ *(info_+position)= c; length_++;}
00081 inline void setHeaderSize(int len){ length_ =len; }
00085 inline unsigned char getOctet(int position){ return info_[position];}
00086
00087 protected :
00088 unsigned char* info_;
00089 int length_;
00090 };
00091
00092
00094
00099 class Packet {
00100
00101 public:
00105 static const int DEFAULT_PAYLOAD_SIZE = 512;
00106 Packet();
00107 Packet(int buffer_length);
00108 int fillPayload(int size, char *inputstream);
00112 inline char* getPayload(){ return payload_;}
00113 void setPayloadSize(int size);
00117 inline int getBufferSize(){return length_;}
00121 inline int getPayloadSize(){ return size_;}
00125 inline int getHeaderSize(){ return header_->getSize();}
00129 inline PacketHdr* accessHeader() { return header_;}
00130 void extractHeader (char * streambuf);
00131 int makePacket ( char* streambuf);
00132
00133 protected:
00134 int size_;
00135 int length_;
00136 char* payload_;
00137 PacketHdr * header_;
00138 };
00139
00141
00148 class Address
00149 {
00150
00151 public:
00153 Address();
00155 Address(const char* hostname, short port);
00156
00161 inline bool isSet() { return (hostname_[0] != '\0' && port_ >= 0); }
00165 inline void setPort(const short port){ port_ = port; }
00167 inline short getPort(){ return port_; }
00169
00172 inline void setHostname(const char* hostname) {
00173 if (hostname == NULL) hostname_[0] = '\0'; else strcpy(hostname_, hostname); }
00175 inline char* getHostname() {return hostname_;}
00177 inline unsigned char* getHWAddr() { return macaddr_;}
00178 void setHWAddr( unsigned char* hwaddr);
00179 void setHWAddrFromColonFormat(const char* colon_seperated_macaddr);
00180 char * convertHWAddrToColonFormat();
00182 Address *clone();
00186 inline bool isSame(Address* addr)
00187 {
00188 if ( port_== addr->getPort()) return false;
00189 if ( strcmp( hostname_, addr->getHostname() ) == 0 ) return true;
00190 return false;
00191 }
00192 bool isSameMACAddr(Address* addr);
00193
00194 protected:
00195 char hostname_[MAX_HOSTNAME_LENGTH];
00196 short port_;
00197 char * ipaddr_;
00198 unsigned char macaddr_[MAC_ADDR_LENGTH];
00199
00200 };
00201
00203
00214 class Port
00215 {
00216 public:
00218 Port();
00220 virtual ~Port(){}
00224 virtual void init()=0;
00226 void setAddress(Address *addr);
00228 void setRemoteAddress( Address *daddr);
00230 inline Address *getRemoteAddr(){return &itsaddr_;}
00232 inline void closePort(){close(sockfd_);}
00233 protected:
00235 struct sockaddr* setSockAddress(Address *addr, struct sockaddr_in *address);
00237 void decodeSockAddress ( Address *addr, struct sockaddr_in *address);
00239 inline void setHostname(const char* hostname){ myaddr_.setHostname(hostname);}
00241 inline void setPort(const short port){ myaddr_.setPort(port);}
00243 inline void setRemoteHostname(const char* hostname){itsaddr_.setHostname(hostname);}
00245 inline void setRemotePort(const short port){itsaddr_.setPort(port); }
00247 inline int getSock(){ return sockfd_;}
00248
00249 protected:
00250 Address myaddr_;
00251 Address itsaddr_;
00252 struct sockaddr_in mySockAddress_;
00253 struct sockaddr_in dstSockAddress_;
00254 int sockfd_;
00255 };
00256
00257
00259
00268 class TxTimer{
00269 friend class SendingPort;
00270 public:
00271 TxTimer(SendingPort *txport);
00276 void startTimer(float delay);
00280 void stopTimer();
00281 public:
00285 static void *timerProc(void *arg);
00286 protected:
00290 SendingPort *port_;
00294 struct timespec tdelay_;
00298 pthread_t tid_;
00299 };
00300
00301
00302
00304
00307 class SendingPort : public Port
00308 {
00309 public:
00310 SendingPort();
00312 SendingPort(char* hostname, short port);
00314 virtual ~SendingPort(){}
00318 void init();
00324 void sendPacket(Packet *pkt);
00328 inline void setBroadcast(){bcastflag_ = 1;}
00332 inline void setBroadcastOff(){bcastflag_ = 0;}
00338 virtual void timerHandler()=0;
00339
00340
00341 protected:
00343
00346 int bcastflag_;
00350 char *sendingbuf_;
00351
00352 public:
00357 TxTimer timer_;
00358 };
00359
00361
00369 class ReceivingPort : public Port
00370 {
00371 public:
00372 ReceivingPort();
00373 virtual ~ReceivingPort(){}
00374 void init();
00376 Packet* receivePacket();
00377
00378 protected:
00382 Packet *pkt_;
00383 char *tmpBuffer_;
00384 };
00385
00387
00390 class LossyReceivingPort: public ReceivingPort
00391 {
00392 public:
00393 LossyReceivingPort(float lossyratio);
00394 ~LossyReceivingPort(){}
00395 Packet* receivePacket();
00396 protected:
00397 float loss_ratio_;
00398 int secdelay_;
00399 };
00400
00401 #endif
00402
00403