104 lines
2.6 KiB
C++
104 lines
2.6 KiB
C++
![]() |
/*
|
|||
|
* ClientSocket 0.2
|
|||
|
* (c) Robert Uhl 2009
|
|||
|
* Datei: ClientSocket.cpp
|
|||
|
* Inhalt: ClientSocket Implementierung
|
|||
|
*/
|
|||
|
|
|||
|
#include "ClientSocket.h"
|
|||
|
|
|||
|
//#define DEBUG DEBUG // Debugging an/aus(auskommentieren!)
|
|||
|
|
|||
|
/*
|
|||
|
* PUBLIC Methoden
|
|||
|
*/
|
|||
|
|
|||
|
// Konstruktor, der den Typ des Sockets <20>bergeben bekommt
|
|||
|
ClientSocket::ClientSocket(const int iType) : p_iType(iType), p_iSocket(-1), p_bVerbunden(false) {
|
|||
|
p_iSocket = socket(AF_INET, p_iType, 0); // Socket anlegen
|
|||
|
|
|||
|
if (p_iSocket == -1) {
|
|||
|
std::cerr << "--> Socket konnte nicht angelegt werden!" << std::endl;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Destruktor
|
|||
|
ClientSocket::~ClientSocket(void) {
|
|||
|
if (p_bVerbunden) {
|
|||
|
Disconnect();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* PRIVATE Methoden
|
|||
|
*/
|
|||
|
|
|||
|
// Verbindung zum Server aufnehmen
|
|||
|
// R<>ckgabe: true wenn Verbindung erfolgreich aufgebaut
|
|||
|
bool ClientSocket::Connect(const std::string& sServer, const unsigned short iPort) {
|
|||
|
struct sockaddr_in strAdresse;
|
|||
|
struct in_addr strInAdresse;
|
|||
|
struct hostent* strHost;
|
|||
|
|
|||
|
if (p_iSocket == -1) {
|
|||
|
std::cerr << "--> Connect(): Socket wurde nicht angelegt!" << std::endl;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (p_bVerbunden) {
|
|||
|
std::cerr << "--> Connect(): Achtung, noch verbunden! Keine neue Verbindung angelegt!" << std::endl;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// Domainnamen in IP aufl<66>sen
|
|||
|
strHost = gethostbyname(sServer.c_str());
|
|||
|
#ifdef DEBUG
|
|||
|
std::cout << "Host: " << strHost->h_name << std::endl;
|
|||
|
std::cout << "IP: " << inet_ntoa( **(struct in_addr**) strHost->h_addr_list) << std::endl;
|
|||
|
std::cout << "Port: " << iPort << std::endl;
|
|||
|
#endif
|
|||
|
// IP-Adresse f<>r connect() erzeugen
|
|||
|
strInAdresse = **(struct in_addr**) strHost->h_addr_list;
|
|||
|
strAdresse.sin_family = AF_INET;
|
|||
|
strAdresse.sin_port = htons(iPort);
|
|||
|
strAdresse.sin_addr = strInAdresse;
|
|||
|
|
|||
|
// Verbindung aufbauen
|
|||
|
if (connect(p_iSocket, (struct sockaddr*) &strAdresse, sizeof(strAdresse)) == -1) {
|
|||
|
std::cerr << "--> connect() nicht erfolgreich!" << std::endl;
|
|||
|
return false;
|
|||
|
} else {
|
|||
|
p_bVerbunden = true;
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Verbindung zum Server abbauen
|
|||
|
void ClientSocket::Disconnect(void) {
|
|||
|
if (close(p_iSocket) == -1) {
|
|||
|
std::cerr << "--> Disconnect(): Konnte die Verbindung nicht schliessen!" << std::endl;
|
|||
|
} else {
|
|||
|
p_bVerbunden = false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Sendet etwas <20>ber das Socket
|
|||
|
bool ClientSocket::Send(const void* vDaten, ssize_t data_len) {
|
|||
|
if (p_iSocket == -1) {
|
|||
|
std::cerr << "--> Send(): Socket wurde nicht angelegt!" << std::endl;
|
|||
|
return false;
|
|||
|
} else if (!p_bVerbunden) {
|
|||
|
std::cerr << "--> Send(): Noch keine Verbindung aufgebaut!" << std::endl;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// Senden
|
|||
|
if (send(p_iSocket, vDaten, data_len, 0) != data_len) {
|
|||
|
std::cerr << "--> Send(): Es konnte nicht alles gesendet werden!" << std::endl;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
// eof
|