Skip to content

Commit db4160a

Browse files
committed
Fixing Windows Client
1 parent 5ee8c3b commit db4160a

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed

include/internal/DataStructures.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,14 @@ namespace SL {
110110
WSocket(std::shared_ptr<PARENTTYPE>& s, asio::ssl::context& sslcontext) :
111111
Parent(s),
112112
Socket(s->WSContextImpl_->io_service, sslcontext),
113+
ping_deadline(s->WSContextImpl_->io_service),
113114
read_deadline(s->WSContextImpl_->io_service),
114115
write_deadline(s->WSContextImpl_->io_service),
115116
strand(s->WSContextImpl_->io_service) {}
116117
WSocket(std::shared_ptr<PARENTTYPE>& s) :
117118
Parent(s),
118119
Socket(s->WSContextImpl_->io_service),
120+
ping_deadline(s->WSContextImpl_->io_service),
119121
read_deadline(s->WSContextImpl_->io_service),
120122
write_deadline(s->WSContextImpl_->io_service),
121123
strand(s->WSContextImpl_->io_service) {}
@@ -165,6 +167,8 @@ namespace SL {
165167
read_deadline.cancel(ec);
166168
ec.clear();
167169
write_deadline.cancel(ec);
170+
ec.clear();
171+
ping_deadline.cancel(ec);
168172
}
169173
unsigned char* ReceiveBuffer = nullptr;
170174
size_t ReceiveBufferSize = 0;
@@ -176,6 +180,7 @@ namespace SL {
176180
std::shared_ptr<PARENTTYPE> Parent;
177181
SOCKETTYPE Socket;
178182

183+
asio::basic_waitable_timer<std::chrono::steady_clock> ping_deadline;
179184
asio::basic_waitable_timer<std::chrono::steady_clock> read_deadline;
180185
asio::basic_waitable_timer<std::chrono::steady_clock> write_deadline;
181186
asio::strand strand;

include/internal/WebSocketProtocol.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,30 @@ namespace SL {
3737
});
3838
}
3939
}
40+
template<class PARENTTYPE, class SOCKETTYPE> void start_ping(const PARENTTYPE& parent, const SOCKETTYPE& socket, std::chrono::seconds secs)
41+
{
42+
std::error_code ec;
43+
if (secs.count() == 0) socket->ping_deadline.cancel(ec);
44+
socket->ping_deadline.expires_from_now(secs, ec);
45+
if (ec) {
46+
SL_WS_LITE_LOG(Logging_Levels::ERROR_log_level, ec.message());
47+
}
48+
else if (secs.count() > 0) {
49+
socket->ping_deadline.async_wait([parent, socket, secs](const std::error_code& ec) {
50+
if (ec != asio::error::operation_aborted) {
51+
WSMessage msg;
52+
char p[] = "ping";
53+
msg.Buffer = std::shared_ptr<unsigned char>(new unsigned char[sizeof(p)],[] (unsigned char* ptr) { delete[] ptr; });
54+
memcpy(msg.Buffer.get(), p, sizeof(p));
55+
msg.len = sizeof(p);
56+
msg.code = OpCode::PING;
57+
msg.data = msg.Buffer.get();
58+
sendImpl(parent, socket, msg, false);
59+
start_ping(parent, socket, secs);
60+
}
61+
});
62+
}
63+
}
4064
template<class PARENTTYPE, class SOCKETTYPE> void writeexpire_from_now(const PARENTTYPE& parent, const SOCKETTYPE& socket, std::chrono::seconds secs)
4165
{
4266

src/internal/ClientImpl.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <fstream>
66
#include <string>
7+
#include <chrono>
78

89
namespace SL {
910
namespace WS_LITE {
@@ -70,6 +71,7 @@ namespace SL {
7071
socket->CompressionEnabled = true;
7172
}
7273
socket->SocketStatus_ = SocketStatus::CONNECTED;
74+
start_ping(self, socket, std::chrono::seconds(5));
7375
if (self->onConnection) {
7476
self->onConnection(socket, header);
7577
}

src/internal/ListenerImpl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace SL {
3131
if (!ec) {
3232
SL_WS_LITE_LOG(Logging_Levels::INFO_log_level, "Connected: Sent Handshake bytes " << bytes_transferred);
3333
socket->SocketStatus_ = SocketStatus::CONNECTED;
34+
start_ping(listener, socket, std::chrono::seconds(5));
3435
if (listener->onConnection) {
3536
listener->onConnection(socket, handshakecontainer->Header);
3637
}

0 commit comments

Comments
 (0)