-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient_sock.cpp
More file actions
138 lines (107 loc) · 3.14 KB
/
client_sock.cpp
File metadata and controls
138 lines (107 loc) · 3.14 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <cstring>
//#include <ws2tcpip.h>
#include "client_sock.h"
#pragma comment(lib, "ws2_32.lib")
#pragma warning( disable : 4996)
ClientSock::ClientSock(string host, unsigned int port) {
connect(host, port);
}
ClientSock::ClientSock() {
connected = false;
}
ClientSock::ClientSock(int sock) {
socket = sock;
connected = true;
}
ClientSock::~ClientSock() {
disconnect();
WSACleanup();
}
int ClientSock::connect(string host, unsigned int port) {
auto wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
WSAStartup(wVersionRequested, &wsaData);
ClientSock::host = host;
ClientSock::port = port;
socket = -1;
return reconnect();
/*socket = ::socket(AF_INET, SOCK_STREAM, 0);
if (socket == -1) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
reconnect();
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_pton(AF_INET, host.c_str(), &servaddr.sin_addr);
for(int i = 0; i < 3; ++i) { //try to connect 3 times
if (::connect(socket, (struct sockaddr*) &servaddr, sizeof(servaddr)) >= 0) {
connected = true;
return 0;
}
}
if (!connected) {
std::cerr << "Cant connect to server\nTry to reconnect" << std::endl;
connect(host, port);
}
connected = false;
return 1;*/
}
int ClientSock::reconnect() {
if (connected)
return 0;
if (socket == -1)
socket = ::socket(AF_INET, SOCK_STREAM, 0);
hostent * record = gethostbyname(host.c_str());
in_addr * address = (in_addr * )record->h_addr;
string ip_address = inet_ntoa(* address);
if (socket == -1) {
printf("socket failed with error: %ld\n", WSAGetLastError());
Sleep(1000);
return reconnect();
}
servaddr = { 0 };
//memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
inet_pton(AF_INET, ip_address.c_str(), &servaddr.sin_addr);
if (::connect(socket, (struct sockaddr*) &servaddr, sizeof(servaddr)) >= 0) {
connected = true;
return 0;
}
if (!connected) {
std::clog << "Cant connect to server\nTry to reconnect" << std::endl;
Sleep(1000);
return reconnect();
}
connected = true;
return 0;
}
int ClientSock::disconnect() {
if(!connected)
return -1;
closesocket(socket);
connected = false;
return 0;
}
int ClientSock::write(const string& buffer) {
if(!connected)
return 1;
if (socket == -1)
throw std::runtime_error("cant write buffer because of socket isnt initialized");
int result = send(socket, buffer.c_str(), buffer.size(), 0);
if (result == -1)
throw std::runtime_error("send failed");
return 0;
}
string ClientSock::read() {
if (!connected)
return "";
const unsigned int buffSize = 1025;
char buffer[buffSize];
int result = ::recv(socket, buffer, 1024, 0);
if (result == -1)
throw std::runtime_error("read failed");
return std::string(buffer, result);
}