GlobalObjects
|
Eine einfache TCP-Clientklasse, welche ihr KnowHow in den abgeleiteten Klassen lernen soll. Mehr ...
#include <TcpClient.h>
Öffentliche Methoden | |
Client (const std::string &rsHostname, unsigned int uiPort, int iAdressFamily, int iSocketType, int iProtocol, int iSecTimeOut) | |
Client (const std::string &rsHostname, unsigned int uiPort, int iAdressFamily, int iSocketType, int iProtocol, unsigned int uiDataSize, int iSecTimeOut) | |
virtual | ~Client () |
int | acceptServerMessage (Message *pTcpServerMessage) |
virtual void | cancel () override |
int | connectServer () |
virtual int | disconnectServer () |
std::string | getHostName () const |
int | getPeerName (std::string &rsIPAdress, unsigned int &ruiPort) const |
int | getSocketAdrFromString (SOCKADDR_IN *Socketadress, const std::string &rsHostnameOrIp) const |
ActionCode | getWaitingServerMsgActionCode () const |
bool | isServerConnected () const |
virtual int | send (char *pszRawMsg, unsigned int uiRawMsgSize, unsigned int uiMessageID=0, int iActionCode=0, const std::string &rsInfo="") |
virtual int | send (Message *pTcpMessage) override |
virtual void | setDataSize (unsigned int uiDataSize) override |
Öffentliche Methoden geerbt von tcp::TcpMain | |
TcpMain (unsigned int uiPort, int iAdressFamily, int iSocketType, int iProtocol, int iSecTimeOut) | |
TcpMain (unsigned int uiPort, int iAdressFamily, int iSocketType, int iProtocol, unsigned int uiDataSize, int iSecTimeOut) | |
virtual | ~TcpMain () |
unsigned int | getDataSize () const |
SOCKET | getMainSocket () const |
unsigned int | getPortNum () const |
void | setTimeOutSec (int iSecTimeOut) |
int | TimeOutSec () |
Öffentliche Methoden geerbt von eut::RepeatingThread | |
RepeatingThread () | |
virtual | ~RepeatingThread () |
virtual void | finishBreak () |
int | getBreakCounter () |
bool | isInExclusiveAccess () const |
void | setExclusiveAccess () |
void | signalInput () |
virtual int | start () |
RepeatingThread::STATUS | status () const |
virtual void | takeABreak () |
bool | testCancel () |
void | unsetExclusiveAccess () |
void | waitForInput () |
Geschützte Methoden | |
Client () | |
Client (unsigned int, int, int, int, int) | |
virtual ClientReceiver * | generateNewReceiver () |
virtual Transmitter * | generateNewTransmitter () |
virtual void | processServerMessage (Message *pTcpMessage) |
virtual int | syncDataSize () |
virtual void | work () override |
Geschützte Methoden geerbt von tcp::TcpMain | |
TcpMain () | |
void | setWSACleanup () const |
int | startWinsock () const |
Geschützte Methoden geerbt von eut::RepeatingThread | |
ORDER | getOrder () |
STATUS | getStatus () |
void | setStatus (STATUS eStatus) |
void | threadWork () |
void | toOrder (ORDER eOrder) |
Geschützte Attribute | |
ClientReceiver * | m_pReceiver |
Transmitter * | m_pTransmitter |
Geschützte Attribute geerbt von tcp::TcpMain | |
int | m_iAdressFamily |
int | m_iProtocol |
int | m_iSecTimeOut |
int | m_iSocketType |
SOCKET | m_MainSocket |
unsigned int | m_uiDataSize |
unsigned int | m_uiServerPort |
Private Methoden | |
Client (const Client &) | |
Client & | operator= (const Client &) |
Private Attribute | |
ActionCode | m_eToWaitingForServer |
std::queue< Message * > | m_MsgQueue |
std::string | m_sHostname |
SOCKADDR_IN | m_Socketadress |
Weitere Geerbte Elemente | |
Öffentliche Typen geerbt von eut::RepeatingThread | |
enum | EuTHREADERROR { EuTHREAD_ERR_NO_THREAD = -10301 , EuTHREAD_ERR_THREAD_ALREADY_WORKING = -10302 , EuTHREAD_ERR_THREAD_BREAK_COUNT_LESS_THAN_ZERO = -10303 , EuTHREAD_ERR_UNKNOWN = -10400 } |
Fehlerbereich = -10301 bis -10400 Mehr ... | |
enum | ORDER { eUNDEFINED , eDO_WORK , eEXIT } |
enum | STATUS { eAT_THE_START , eWORKING , ePAUSING , eENDING , eCOMPLETED } |
Öffentliche Attribute geerbt von eut::RepeatingThread | |
std::string | m_strDebugInfo |
Eine einfache TCP-Clientklasse, welche ihr KnowHow in den abgeleiteten Klassen lernen soll.
Client läuft als Thread, welcher Verbindung zu einem Socket-Server aufnehmen kann.
Client hat als Oberklassen-Attribute den Port, die Datengröße welche versendet wird, die Adressfamilie, den Sockettyp, den Protokoltyp und einen MainSocket (hier den Verbindungssocket zum Server).
Zusätzlich sind hier als Attribute ein ClientReceiver, welcher die Daten vom Server als Thread bearbeitet, ein Transmitter, welcher Daten an den Server sendet, die Socketadresse, der Hostname und eine MsgQueue, welche die einzelnen Messages des ClientReceiver aufnimmt.
Bei der instanziierung mit Übergabe von Hostname, Port, Adressfamilie, Sockettyp, Protokol und optional der Datengröße, wird zuerst einmal die Socketadresse anhand des übergebenen Hostnamen ermittelt und der eigene Thread gestartet.
Es wird versucht, mit dem Server über die Client-Methode Client::connectServer() Kontakt aufzunehem. Wenn dieses gelingt, werden der ClientReceiver und Transmitter instanziiert und gestartet (auch diese sind Threads).
Der Client wartet in Client::work() auf Daten vom Server (lauscht blockierent).
Der Socket wird im ClientReceiver in ClientReceiver::work() freigegeben. Wenn Fehler < 0, dann ist die Verbindung abgebrochen.
Es wird über ClientReceiver::generateNewTcpMessage (...) eine tcp::Message bzw. abgeleitete Message erstellt und an ClientReceiver::acceptMessage(AbstractMessage*) weitergegeben.
Diese Methode kann überschrieben werden; der ClientReceiver reicht die Message lediglich an seinen Parent (Client oder Unterklasse) Client::acceptServerMessage() weiter. Dort wird die Message in die MsgQueue des Clients eingefügt und in Client::work() weiterverarbeitet und an die Clientmethode Client::processServerMessage(Message *) weitergeleitet, welche hier anschließend die Message löscht; auch diese Methode kann überschrieben werden.
Gesendet wird über Client::send (...) (kann in Unterklassen überschrieben werden) welche die Daten hier in eine tcp::Message packt und an Transmitter::acceptOrder (...) zum weiterverarbeiten übergibt, der diese Daten dann an den Server sendet.
Über Client::disconnectServer() wird die Verbindung zum Server abgebaut. Es werden der ClientReceiver und Transmitter entfernt. Ein erneutes connect ist möglich.
|
protected |
Dieser Konstruktor steht niccht zur Verfügung.
|
protected |
Dieser Konstruktor steht niccht zur Verfügung.
tcp::Client::Client | ( | const std::string & | rsHostname, |
unsigned int | uiPort, | ||
int | iAdressFamily, | ||
int | iSocketType, | ||
int | iProtocol, | ||
int | iSecTimeOut ) |
Der Konstruktor startet den Client, ist aber noch nicht mit dem Server aus rsHostname verbunden.
[in] | rsHostname | Der Hostname oder IP-Adresse (z.B. "LOCALHOST" oder "192.168.2.102"). |
[in] | uiPort | Der Port des Servers. |
[in] | iAdressFamily | Die Socket-AdressFamily um einen Socket zu instanziieren (i.d.R. AF_INET). |
[in] | iSocketType | Der Socket-Typ (i.d.R. SOCK_STREAM). |
[in] | iProtocol | Das Socket-Protokol (i.d.R. 0). |
[in] | iSecTimeOut | Die Zeit bis ein Warten auf eine Verbindung bzw. warten auf Daten abgebrochen wird. |
eut::ErrorNException | Bei einem Fehler wird eine Exception geworfen. |
tcp::Client::Client | ( | const std::string & | rsHostname, |
unsigned int | uiPort, | ||
int | iAdressFamily, | ||
int | iSocketType, | ||
int | iProtocol, | ||
unsigned int | uiDataSize, | ||
int | iSecTimeOut ) |
Der Konstruktor startet den Client, ist aber noch nicht mit dem Server aus rsHostname verbunden.
[in] | rsHostname | Der Hostname oder IP-Adresse (z.B. "LOCALHOST" oder "192.168.2.102"). |
[in] | uiPort | Der Port des Servers. |
[in] | iAdressFamily | Die Socket-AdressFamily um einen Socket zu instanziieren (i.d.R. AF_INET). |
[in] | iSocketType | Der Socket-Typ (i.d.R. SOCK_STREAM). |
[in] | iProtocol | Das Socket-Protokol (i.d.R. 0). |
[in] | uiDataSize | Die Paketgröße. |
[in] | iSecTimeOut | Die Zeit bis ein Warten auf eine Verbindung bzw. warten auf Daten abgebrochen wird. |
eut::ErrorNException | Bei einem Fehler wird eine Exception geworfen. |
|
virtual |
Im Destruktor wird die Verbindung zum Server abgebrochen wenn noch nicht geschehen.
Erneute Implementation in glo::Client.
|
private |
Der Copy-Konstruktor steht nicht zur Verfügung.
int tcp::Client::acceptServerMessage | ( | Message * | pTcpServerMessage | ) |
Es wird die übergebene Message, i.d.R. vom Server über den ClientReceiver in die MsgQueue eingefügt und somit verarbeitet.
[in] | pTcpServerMessage | Die erhaltene Nachricht vom Server. |
|
overridevirtual |
Wenn der Thread beendet wirde, wird diese virtuale Methode aufgerufen. Hier wird die MsgQueue aufgeräumt.
Erneute Implementation von eut::RepeatingThread.
int tcp::Client::connectServer | ( | ) |
Verbindet sich mit dem Server.
|
virtual |
Beendet die Verbindung mit dem Server.
Erneute Implementation in glo::Client.
|
protectedvirtual |
Liefert hier einen ClientReceiver; kann in Unterklassen überschrieben werden um ggf. einen abgeleiteten Typ von ClientReceiver zu liefern.
|
protectedvirtual |
Liefert hier einen Transmitter; kann in Unterklassen überschrieben werden um ggf. einen abgeleiteten Typ von Transmitter zu liefern.
std::string tcp::Client::getHostName | ( | ) | const |
Liefert den Hostname oder IP-Adresse (z.B. "LOCALHOST" oder "192.168.2.102") aus m_sHostname.
int tcp::Client::getPeerName | ( | std::string & | rsIPAdress, |
unsigned int & | ruiPort ) const |
Liefert die IP-Adresse und den Port.
[in,out] | rsIPAdress | Die IP-Adresse (z.B. "192.168.2.102"). |
[in,out] | ruiPort | Der Port welcher angesprochen wird. |
int tcp::Client::getSocketAdrFromString | ( | SOCKADDR_IN * | Socketadress, |
const std::string & | rsHostnameOrIp ) const |
Liefert den Hostnamen als IP-Adresse.
[in,out] | Socketadress | In dieser Struktur wird die IP-Adresse geliefert. |
[in] | rsHostnameOrIp | Der Hostname (z.B. "LOCALHOST"). |
ActionCode tcp::Client::getWaitingServerMsgActionCode | ( | ) | const |
Liefert den ActionCode der Message, auf die gewartet wird.
bool tcp::Client::isServerConnected | ( | ) | const |
Gibt Auskunft, ob mit dem Server verbunden.
Der Zuweisungsoperator steht nicht zur Verfügung.
|
protectedvirtual |
Soll in Unterklassen die Nachricht vom Server verarbeiten. In den überschriebenen Methoden mus immer diese Methode aufgerufen werden, weil hier u.a. die übergebene Message aus dem Speicher entfernt wird.
[in] | pTcpMessage | Die zu verarbeitende Nachricht vom Server. |
Erneute Implementation in glo::Client.
|
virtual |
Sendet die übergebene Daten in einer Message über seinen Transmitter an den Server.
[in] | pszRawMsg | Zeiger auf die zu sendenden Daten. |
[in] | uiRawMsgSize | Die Größe der zu sendenden Daten. |
[in] | uiMessageID | Es kann eine MessageID übergeben werden. |
[in] | iActionCode | Es kann ein ActionCode übergeben werden. |
[in] | rsInfo | Es kann eine freie Info übergeben werden. |
|
overridevirtual |
Sendet übergebene Message über seinen Transmitter an den Server.
[in] | pTcpMessage | Das zu sendende Nachrichtenpacket. |
Implementiert tcp::TcpMain.
|
overridevirtual |
Setzt die Paketgröße.
[in] | uiDataSize | Die Paketgröße. |
Erneute Implementation von tcp::TcpMain.
|
protectedvirtual |
Synchronisiert die Datengröße mit dem Server.
|
overrideprotectedvirtual |
Arbeit des Threads. Es wird eine erhaltene Message an Methode Client::processServerMessage(Message * pTcpMessage) weitergereicht.
Implementiert eut::RepeatingThread.
|
private |
Wenn dieser Wert ungleich ACTION_UNDEF, wird in Client::work() jede Message, welche nicht diesen ActionCode hat, wieder in die MsgQueue angehängt. Somit wird in Client::work() auf die Message mit diesem ActionCode gewartet.
Wenn dann, in Client::work(), die Message mit dem diesem ActionCode eintrifft, wird m_eToWaitingForServer wieder auf ACTION_UNDEF gesetzt und die Message zur Weiterverarbeitung an Client::processServerMessage (...) weiter gereicht.
|
private |
Die Queue mit den empfangenen Daten vom Server.
|
protected |
Der Leser empfängt Daten von einem Server für diesen Client.
|
protected |
Der Schreiber sendet Daten an einen Server für diesen Client.
|
private |
Der Hostname oder IP-Adresse (z.B. "LOCALHOST" oder "192.168.2.102").
|
private |
Die Adressstruktur.