Her er alle mine headers:
//ConnectionLostException.h
#if !defined(CONNECTIONLOSTEXCEPTION_H)
#define CONNECTIONLOSTEXCEPTION_H
#include "NetException.h"
class ConnectionLostException : public NetException
{
public:
ConnectionLostException(string description);
};
#endif
//Exception.h
#if !defined(EXCEPTION_H)
#define EXCEPTION_H
#include <iostream>
#include <string>
using namespace std;
class Exception
{
//Denne funktion gør at vi kan skrive en
//exception til en strøm som f.eks. cout
friend ostream & operator<<(ostream & out, Exception & e);
public:
//Denne funktion gør at vi kan caste en
//exception til et string objekt
operator string ();
protected:
Exception(string description);
private:
string m_description;
};
#endif
//IPAddress.h
#if !defined(IPADDRESS_H)
#define IPADDRESS_H
#include <string>
#include <vector>
#include "Types.h"
#if defined(_WIN32)
#include <winsock2.h>
#elif defined(__linux__)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif
using namespace std;
class IPAddress
{
public:
//Opretter et IPAddress objekt ud fra en streng
//som enten indeholder en IP adresse i dotted notation
//eller et host navn.
IPAddress(string & adr);
//Ipretter et IPAddress objekt ud fra en in_addr struktur.
//Dette bliver nødvendigt i en senere artikel om server programmering.
IPAddress(struct in_addr adr);
//Fortæller hvor mange adresser, der er tilknyttet denne adresse
UInt32 numAdresses();
//Returnerer adressen med det givne nummer som in_addr struktur
struct in_addr getAddress(UInt32 index);
//Returnerer adressen med det givne nummer som streng
string getAddressString(UInt32 index);
//Fortæller hvor mange aliaser, der findes for denne adresse
UInt32 numAliases();
//Returnerer aliaset med det givne nummer
string getAlias(UInt32 index);
//Returnerer det officielle navn for denne adresse
string getOfficialName();
//Konverterer denne adresse til en streng
operator string();
private:
//Laver opslaget fra en in_addr struktur
void fromInAddr(struct in_addr adr);
//Definerer en vector indeholdende strenge
typedef vector<string> StringVector;
//Definerer en vector indeholdende in_addr strukturer
typedef vector<struct in_addr> InAddrVector;
//Vores liste af aliaser
StringVector m_aliases;
//Vores liste af adresser
InAddrVector m_adresses;
//Det officielle navn
string m_officialName;
};
#endif
//mutex.h
#if !defined(MUTEX_H)
#define MUTEX_H
#if defined(__linux__)
#include <pthread.h>
#elif defined(_WIN32)
#include <windows.h>
#endif
class Mutex
{
private:
#if defined(__linux__)
//Linux mutex objekt
pthread_mutex_t m_mutex;
#elif defined(_WIN32)
//Windows mutex objekt
CRITICAL_SECTION m_mutex;
#endif
public:
//Initialiserer mutex objektet
Mutex();
//Frigiver mutex objektet
~Mutex();
//Låser mutex objektet. Blokerer til mutexen kan låses.
void enter();
//Låser mutex objektet medmindre det allerede er låst.
//Returnerer true hvis mutexen blev låst. Ellers returneres false.
bool tryEnter();
//Låser mutex objektet op
void leave();
};
#endif
//Net.h
#if !defined(NET_H)
#define NET_H
#if defined(__linux__)
#define netInit()
#define netRelease()
#elif defined _WIN32
void NetInit();
void NetRelease();
#define netInit() NetInit()
#define netRelease() NetRelease()
#endif
#endif
//NetException.h
#if !defined(NETEXCEPTION_H)
#define NETEXCEPTION_H
#include "Exception.h"
class NetException : public Exception
{
public:
NetException(string description);
};
#endif
//TCPServerSocket.h
#if !defined(TCPSERVERSOCKET_H)
#define TCPSERVERSOCKET_H
#include "TCPSocket.h"
#include "IPAddress.h"
#include "Types.h"
#include <string>
using namespace std;
class TCPServerSocket
{
public:
//Opretter et TCPServerSocket som kan lytte på alle adresser
//og på den angivne port og med det givne timeout
TCPServerSocket(UInt16 port, UInt32 timeOut = 0);
//Opretter et TCPServerSocket som kun lytter på adressen
//angivet som en streng og på den angivne port og med det givne timeout
TCPServerSocket(string adr, UInt16 port, UInt32 timeOut = 0);
//Opretter et TCPServerSocket som kun lytter på adressen
//angivet som en IPAddress og på den angivne port og med det givne timeout
TCPServerSocket(IPAddress adr, UInt16 port, UInt32 timeOut = 0);
//Deallokerer og lukker evt. serveren
~TCPServerSocket();
//Lukker serveren. En lukket server kan ikke sættes til at lytte igen.
void close();
//Sætter serveren til at lytte
void listen();
//Returnerer en dynamisk allokeret TCPSocket til en klient som har forbundet.
//Hvis 'm_timeOut' er større end 0 ventes dette antal
//millisekunder eller til der er en klient. Udløber
//tiden kastes en TimerException.
TCPSocket * accept();
//Sætter et nyt timeout som virker fra næste gang vi kalder 'accept()'
//Der ventes 'timeOut' millisekunder hvis 'timeOut' > 0. Ellers ventes
//til der er en klient
void setTimeOut(UInt32 timeOut);
//Returnerer timeout
UInt32 getTimeOut();
//Returnerer porten, der lyttes på
UInt16 getPort();
private:
//Opretter vores server socket og binder den til den angivne adresse og port
void makeAndBind(struct in_addr address);
//Denne funktion blokerer i 'm_timeOut' millisekunder, eller til
//der er en klient
void waitForClient();
//Porten som vi lytter på
UInt16 m_port;
//Antallet af millisekunder vi skal vente på blokerende kald.
//Hvis denne er 0, venter vi evigt.
UInt32 m_timeOut;
//Vores server socket
int m_serverSocket;
};
#endif
//TCPSocket.h
#if !defined(TCPSOCKET_H)
#define TCPSOCKET_H
#include "IPAddress.h"
class TCPSocket
{
//Dette gør, at TCPServerSocket, som vi laver i næste artikel, kan bruge vores
//private constructor
friend class TCPServerSocket;
public:
//Opretter en socket som forbinder til en adresse
//baseret på IPAddress klassen og en port
TCPSocket(IPAddress & adr, UInt16 port, UInt32 timeOut = 0);
//Opretter en socket som forbinder til en adresse
//baseret på string klassen og en port
TCPSocket(string & adr, UInt16 port, UInt32 timeOut = 0);
//Deallokerer socket objektet, lukker evt. forbindelsen
~TCPSocket();
//Sætter et nyt timeout som virker fra næste gang vi kalder 'read()'
//Der ventes 'timeOut' millisekunder hvis 'timeOut' > 0. Ellers ventes
//til der er data
void setTimeOut(UInt32 timeOut);
//Opretter en socket og forbinder til den angivne adresse og port
void connect();
//Læser op til 'size' bytes og placerer dem i 'buffer'.
//Returnerer antallet af bytes, som blev læst.
//Hvis 'm_timeOut' er større end 0 ventes dette antal
//millisekunder eller til der er data at læst. Udløber
//tiden kastes en TimerException.
SInt32 read(void * buffer, SInt32 size);
//Skriver 'size' bytes fra 'buffer'.
//Returnerer antallet af bytes, som blev skrevet.
SInt32 write(const void * buffer, SInt32 size);
//Lukker forbindelsen og frigiver vores socket
void close();
//Returnerer en pointer til adressen
IPAddress * getAddress();
//Returnerer porten
UInt16 getPort();
//Returnerer timeout
UInt32 getTimeOut();
private:
//Denne constructor opretter et TCPSocket objekt ud fra en eksisterende
//socket. Det bliver nødvendigt i næste artikel, hvor vi programmerer
//servere. Den vil blive brugt af TCPServerSocket klassen
TCPSocket(int socket, struct sockaddr_in sock_addr, UInt32 timeOut = 0);
//Denne funktion blokerer i 'm_timeOut' millisekunder, eller til
//der er data at læse.
void waitForData();
//Adressen som vi skal forbinde til
IPAddress m_address;
//Porten som vi forbinder til
UInt16 m_port;
//Vores socket
int m_socket;
//Antallet af millisekunder vi skal vente på blokerende kald.
//Hvis denne er 0, venter vi evigt.
UInt32 m_timeOut;
};
#endif
//Thread.h
#if !defined(THREAD_H)
#define THREAD_H
#if defined(__linux__)
#include <pthread.h>
#elif defined(_WIN32)
#include <windows.h>
#endif
class Thread
{
private:
#if defined(__linux__)
//Funktionen som kaldes af Linux
static void * thread_function(void * parameter);
//Handle til tråden
pthread_t m_thread;
#elif defined(_WIN32)
//Funktionen som kaldes af Windows
static DWORD WINAPI thread_function(LPVOID parameter);
//Handle til tråden
HANDLE m_thread;
#endif
protected:
//Denne funktion skal overstyres af nedarvende klasser
virtual void run() = 0;
public:
//Trådens constructor
Thread();
//Denne funktion får den kaldende tråd til at standse
//til dette tråd objekt er færdig med at eksekvere
void waitForThread();
//Denne funktion vil starte tråden
void start();
};
#endif
//ThreadException.h
#if !defined(THREADEXCEPTION_H)
#define THREADEXCEPTION_H
#include "Exception.h"
class ThreadException : public Exception
{
public:
ThreadException(string description);
};
#endif
//TimerException.h
#if !defined(TIMEREXCEPTION_H)
#define TIMEREXCEPTION_H
#include "Exception.h"
class TimerException : public Exception
{
public:
TimerException(string description);
};
#endif
//Types.h
#if !defined(TYPES_H)
#define TYPES_H
typedef signed char SInt8;
typedef unsigned char UInt8;
typedef signed short SInt16;
typedef unsigned short UInt16;
typedef signed int SInt32;
typedef unsigned int UInt32;
#endif
//UDPSocket.h
#if !defined(UDPSOCKET_H)
#define UDPSOCKET_H
#include "IPAddress.h"
#include "Mutex.h"
class UDPSocket
{
public:
//Opretter en UDP socket som ikke
//er bundet til hverken port eller adresse
//Denne socket SKAL sende den første pakke
UDPSocket();
//Opretter en UDP socket som binder
//til den specificerede port og alle netkort
UDPSocket(UInt16 port);
//Opretter en UDP socket som binder
//til den specificerede port og adresse
UDPSocket(IPAddress adr, UInt16 port);
//Frigiver den interne socket
~UDPSocket();
//Sætter et nyt timeout som virker fra næste gang vi kalder 'read()'
//Der ventes 'timeOut' millisekunder hvis 'timeOut' > 0. Ellers ventes
//til der er data
void setTimeOut(UInt32 timeOut);
//Returnerer timeout
UInt32 getTimeOut();
//Skriver 'size' bytes fra 'buffer' til den angivne adresse og port
//Returnerer antallet af bytes, som blev skrevet
SInt32 write(const void * buffer, UInt32 size, IPAddress * adr, UInt16 port);
//Læser højst 'size' bytes og placerer dem i 'buffer'
//Hvis 'adr' ikke er NULL indeholder den efter dette kald afsenderens adresse
//Adressen bliver dynamisk allokeret
//Hvis 'port' ikke er NULL bliver den opdateret med afsenderens port
SInt32 read(void * buffer, UInt32 size, IPAddress ** adr, UInt16 * port);
//Returnerer 'true' hvis broadcasting er tilladt på denne UDP socket
bool broadcastEnabled();
//Slår broadcasting til eller fra på denne UDP socket
void enableBroadcast(bool doEnable);
private:
//Denne funktion blokerer i 'm_timeOut' millisekunder, eller til
//der er data at læse.
void waitForData();
//Vores socket
int m_socket;
//Antallet af millisekunder vi skal vente på blokerende kald.
//Hvis denne er 0, venter vi evigt.
UInt32 m_timeOut;
};
#endif
//UnknownHostException.h
#if !defined(UNKNOWNHOSTEXCEPTION_H)
#define UNKNOWNHOSTEXCEPTION_H
#include "NetException.h"
class UnknownHostException : public NetException
{
public:
UnknownHostException(string description);
};
#endif