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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef __JAUS_CORE_TRANSPORT_UDP__H
00041 #define __JAUS_CORE_TRANSPORT_UDP__H
00042
00043 #include "jaus/core/transport/transport.h"
00044 #include <cxutils/networking/udpclient.h>
00045 #include <cxutils/networking/udpsharedserver.h>
00046
00047 namespace JAUS
00048 {
00056 class JAUS_CORE_DLL JUDP : public Transport,
00057 public CxUtils::UdpSharedServer::Callback
00058 {
00059 public:
00060 const static unsigned short Port = 3794;
00061 const static unsigned int OverheadSizeBytes = 61;
00062 const static Byte Version = 0x02;
00063 JUDP();
00064 ~JUDP();
00065
00066 virtual void SetPacketPollingDelayMs(const unsigned int delayTimeMs = 0);
00067
00068 virtual bool LoadSettings(const std::string& filename);
00069
00070 virtual bool Initialize(const Address& componentID);
00071
00072 virtual bool IsInitialized() const;
00073
00074 virtual void Shutdown();
00075
00076 virtual Address::List GetConnections() const;
00077
00078 virtual bool HaveConnection(const Address& id) const;
00079
00080 virtual bool SendPacket(const Packet& packet,
00081 const Header& header,
00082 const int broadcastFlags = Service::NoBroadcast) const;
00083
00084 virtual bool SerializeMessage(const Message* message,
00085 Packet::List& stream,
00086 Header::List& streamHeaders,
00087 const UShort startingSequenceNumber,
00088 const int broadcastFlags) const;
00089
00090 virtual Packet GetTransportHeader() const { return mTransportHeader; }
00091
00092 virtual Address::List GetManualConnections() const ;
00093
00094 void SetMaxPacketSize(const unsigned int maxSizeBytes = 1500);
00095
00096 void SetDisconnectTimeMs(const unsigned int timeMs);
00097
00098 void SetTTL(const unsigned char ttl = 16);
00099
00100 void SetMulticastIP(const CxUtils::IP4Address& multicastIP);
00101
00102 void EnableBroadcasting(const bool enabled);
00103
00104 CxUtils::IP4Address GetMulticastIP() const { return mMulticastIP; }
00105
00106 void SetInterfaceIP(const CxUtils::IP4Address& networkIP = CxUtils::IP4Address());
00107
00108 bool AddConnection(const CxUtils::IP4Address& networkIP,
00109 const Address& jausID,
00110 const unsigned short port = Port);
00111 virtual bool CloseConnection(const Address& jausID);
00112
00113 static bool ListenForSubsystems(Address::Set& discovered,
00114 const unsigned int waitTimeMs = 5000,
00115 const CxUtils::IP4Address& multicastIP = "239.255.0.1");
00116 private:
00117 static void ReceiveThread(void* args);
00118 virtual void CheckServiceStatus(const unsigned int timeSinceLastCheckMs);
00119 virtual void ProcessUDP(const Packet& packet,
00120 const CxUtils::IP4Address& ipAddress,
00121 const unsigned short sourcePort);
00122 int UpdateClientConnections(const Address& id,
00123 const CxUtils::IP4Address& ipAddress,
00124 const unsigned short sourcePort);
00125 Time::Stamp mDisconnectTimeMs;
00126 unsigned int mMaxPayloadSize;
00127 unsigned char mTimeToLive;
00128 CxUtils::IP4Address mHostIP;
00129 CxUtils::IP4Address mMulticastIP;
00130 unsigned short mInternalDiscoveryPort;
00131 bool mUseBroadcastingFlag;
00132 Mutex mClientsMutex;
00133 Thread mPrimaryThread;
00134 Thread mSecondaryThread;
00135 unsigned int mDelayTimeMs;
00136 CxUtils::UdpServer mInput;
00137 CxUtils::UdpClient mMulticast;
00138 std::map<Address, Time::Stamp> mUpdateTimes;
00139 std::map<Address, CxUtils::UdpClient*> mClients;
00140 std::map<Address, bool> mPermanentConnections;
00141 Packet mTransportHeader;
00142 volatile bool mPrimaryThreadCreatedFlag;
00143 };
00144 }
00145
00146 #endif
00147