-
Notifications
You must be signed in to change notification settings - Fork 1
/
WahlSockClient.cpp
113 lines (93 loc) · 2.32 KB
/
WahlSockClient.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
109
110
111
112
113
#include "WahlSock.h"
namespace WahlSock {
Client::Client(std::string _ip, int _port, short _protocol, std::string _name) {
server.ip = _ip;
server.port = _port;
server.protocol = _protocol;
server.name = _name;
setServerInfo();
readyToConnect = createClientSocket();
connected = false;
}
Client::Client(Device& _server) {
server = _server;
setServerInfo();
readyToConnect = createClientSocket();
connected = false;
}
bool Client::createClientSocket() {
clientSocket = socket(server.protocol, SOCK_STREAM, 0);
if (clientSocket == SOCKET_ERROR) {
std::cout << "Failed to create client socket" << std::endl;
return false;
}
return true;
}
void Client::setServerInfo() {
SOCKADDR_IN* serverInfoPointer = (SOCKADDR_IN*)&serverInfo;
serverInfoPointer->sin_family = server.protocol;
serverInfoPointer->sin_port = htons(server.port);
inet_pton(AF_INET, server.ip.c_str(), &serverInfoPointer->sin_addr);
}
Client::~Client() {
disconnect();
}
bool Client::connectToServer() {
if (connect(clientSocket, &serverInfo, sizeof(serverInfo))) {
return false;
}
connected = true;
startReceiving();
return true;
}
bool Client::isReadyToConnect() {
return readyToConnect;
}
bool Client::isConnected() {
return connected;
}
void Client::startReceiving() {
std::thread receiver(&Client::recvThread, this);
receiver.detach();
}
void Client::recvThread() {
while (connected) {
ZeroMemory(messageBuffer, MAX_MESSAGE_LENGTH_CLIENT);
int bytesReceived = recv(clientSocket, messageBuffer, MAX_MESSAGE_LENGTH_CLIENT, 0);
if (bytesReceived <= 0) {
disconnect();
break;
}
std::string message(messageBuffer);
messages.push(messageBuffer);
}
}
bool Client::sendMessage(std::string message) {
if (connected) {
send(clientSocket, message.c_str(), message.length() + 1, 0);
return true;
}
return false;
}
int Client::getNumberOfMessages() {
return messages.size();
}
std::string Client::getNextMessage() {
std::string toReturn = messages.front();
messages.pop();
return toReturn;
}
bool Client::newServer(Device& device) {
server = device;
readyToConnect = createClientSocket();
return readyToConnect;
}
bool Client::disconnect() {
if (connected) {
closesocket(clientSocket);
connected = false;
return true;
}
return false;
}
}