forked from JanekOstendorf/THOMAS-Client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTCPClient.cpp
108 lines (82 loc) · 2.78 KB
/
TCPClient.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
-- TCP-CLIENT-KLASSE :: IMPLEMENTIERUNG --
*/
/* INCLUDES */
// Klassenheader
#include "TCPClient.h"
using namespace THOMAS;
// THOMASException-Klasse
#include "THOMASException.h"
// C-String-Funktionen
// In diesem Header ist u.a. die memcpy()-Funktion definiert, ebenso die memset()-Funktion.
#include <cstring>
// UNIX-Funktionen [Non-Standard]
// In diesem Header ist u.a. die close()-Funktion definiert.
#include <unistd.h>
// POSIX-Socket-Funktionen [Non-Standard]
#include <sys/socket.h>
// POSIX-Internet-Protokoll-Funktionen [Non-Standard]
#include <netinet/in.h>
// Netzwerk-Datenbank-Definitionen [Non-Standard]
// Hier wird u.a. die hostent-Struktur definiert, außerdem die gethostbyname()-Funktion.
#include <netdb.h>
/* FUNKTIONEN */
TCPClient::TCPClient()
{
}
TCPClient::~TCPClient()
{
// Ggf. Verbindung trennen
if(_connected)
Disconnect();
}
void TCPClient::Connect(std::string serverAddress, unsigned short port)
{
// Steht schon eine Verbindung?
if(_connected)
throw THOMASException("Fehler: Es besteht bereits eine Verbindung zum Server!");
// Socket erstellen
_socket = socket(AF_INET, SOCK_STREAM, 0);
// Ist bei der Socketerstellung ein Fehler aufgetreten?
if(_socket == -1)
{
// Exception auslösen
throw THOMASException("Beim Erstellen des Client-Sockets ist ein Fehler aufgetreten!");
}
// Serverdaten abrufen
hostent *serverData = gethostbyname(serverAddress.c_str());
// Konnten die Serverdaten ermittelt werden?
if(serverData == NULL)
throw THOMASException("Fehler: Der Server mit der IP " + serverAddress + " wurde nicht gefunden!");
// Server-Adressstruktur erstellen
sockaddr_in serverAdd;
serverAdd.sin_family = AF_INET;
serverAdd.sin_port = htons(port);
memcpy(reinterpret_cast<char *>(&serverAdd.sin_addr.s_addr), reinterpret_cast<char *>(serverData->h_addr_list[0]), serverData->h_length); // Kopiert die ermittelten Serverdaten (z.B. die IP) in die Serveradress-Struktur
memset(&serverAdd.sin_zero, 0, 8); // Das letzte Element der Struktur muss auf 0 gesetzt sein
// Verbindung herstellen
if(connect(_socket, reinterpret_cast<sockaddr *>(&serverAdd), sizeof(serverAdd)) == -1)
{
// Fehler, Exception auslösen
throw THOMASException("Fehler: Die Verbindung mit dem Server (" + serverAddress + ") konnte nicht hergestellt werden!");
}
// Verbindung steht
_connected = true;
}
void TCPClient::Disconnect()
{
// Steht überhaupt eine Verbindung?
if(!_connected)
throw THOMASException("Fehler: Es besteht keine Verbindung zum Server!");
// Client-Socket schließen
close(_socket);
_connected = false;
}
void TCPClient::Send(BYTE *data, int dataLength)
{
// Besteht eine Verbindung?
if(!_connected)
throw THOMASException("Fehler: Es besteht keine Verbindung zum Server!");
// Daten senden
send(_socket, data, dataLength, 0);
}