13#include <sys/socket.h>
17#include <netinet/in.h>
27#pragma comment (lib, "ws2_32.lib")
31#ifndef WINDOWS_STYLE_DEFINITION
32#define WINDOWS_STYLE_DEFINITION
34#define closesocket close
36#define INVALID_SOCKET -1
37#define SOCKET_ERROR -1
48 { std::chrono::duration_cast<std::chrono::milliseconds>(value) };
51 using namespace std::chrono_literals;
65 virtual void throwException(
int line, std::string_view file)
const;
71 Network(std::string_view ip, std::string_view port, int64_t timeout);
79 template<Timeout T = std::chrono::seconds>
80 Network(std::string_view ip, std::string_view port, T timeout = 30s);
84 template<Timeout T = std::chrono::seconds>
85 Network(SOCKET clientSocket, T timeout = 30s);
107 virtual int sendRawData(
const char* data,
int size,
bool& endOfStream,
int flags = 0);
123 virtual int receiveRawData(
char* data,
int size,
bool& endOfStream,
int flags = 0);
128 virtual void log(
const std::string& message, std::any&& data =
"");
148 template<
typename DataT>
149 int sendBytes(
const DataT* data,
int size,
bool& endOfStream,
int flags = 0);
159 template<
typename DataT>
160 int receiveBytes(DataT* data,
int size,
bool& endOfStream,
int flags = 0);
167 Network(ip, port, std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count())
178 if (WSAStartup(MAKEWORD(2, 2), &wsaData))
184 handle = std::shared_ptr<SOCKET>(
new SOCKET(clientSocket), [](SOCKET* ptr) { closesocket(*ptr);
delete ptr; });
186 this->
setTimeout(std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count());
189 template<
typename DataT>
199 lastSend = this->
sendBytesImplementation(
reinterpret_cast<const char*
>(data) + totalSent, size - totalSent, flags);
201 if (lastSend == SOCKET_ERROR)
212 totalSent += lastSend;
213 }
while (totalSent < size);
218 template<
typename DataT>
222 char* actualData =
reinterpret_cast<char*
>(data);
226 std::string_view receiveBuffer =
buffers.front();
227 int fromBufferSize = std::min<int>(
static_cast<int>(receiveBuffer.size()), size);
229 std::copy(receiveBuffer.data(), receiveBuffer.data() + fromBufferSize, actualData);
231 receiveBuffer = std::string_view(receiveBuffer.data() + fromBufferSize, receiveBuffer.size() - fromBufferSize);
233 actualData += fromBufferSize;
234 receive += fromBufferSize;
235 size -= fromBufferSize;
237 if (receiveBuffer.empty())
248 endOfStream = !
static_cast<bool>(receive);
250 if (receive == SOCKET_ERROR)
#define THROW_WEB_EXCEPTION
Definition WebException.h:46
Base network class.
Definition Network.h:55
void addReceiveBuffer(std::string_view buffer)
Add additional data that uses before getting bytes from network.
Definition Network.cpp:211
virtual int receiveRawData(char *data, int size, bool &endOfStream, int flags=0)
Receive data through network.
Definition Network.cpp:184
virtual ~Network()=default
virtual int sendRawData(const char *data, int size, bool &endOfStream, int flags=0)
Send raw data through network.
Definition Network.cpp:136
bool isDataAvailable(int *availableBytes=nullptr) const
Check if Network contains data.
Definition Network.cpp:88
virtual int receiveData(utility::ContainerWrapper &data, bool &endOfStream, int flags=0)
Receive data through network.
Definition Network.cpp:157
std::shared_ptr< SOCKET > handle
Definition Network.h:57
int sendBytes(const DataT *data, int size, bool &endOfStream, int flags=0)
Send raw bytes through network.
Definition Network.h:190
virtual void log(const std::string &message, std::any &&data="")
Errors logging, default implementation uses clog.
Definition Network.cpp:216
std::queue< std::string_view > buffers
Definition Network.h:58
int receiveBytes(DataT *data, int size, bool &endOfStream, int flags=0)
Definition Network.h:219
virtual int sendBytesImplementation(const char *data, int size, int flags=0)
Definition Network.cpp:5
virtual void throwException(int line, std::string_view file) const
Definition Network.cpp:15
virtual int sendData(const utility::ContainerWrapper &data, bool &endOfStream, int flags=0)
Send data through network.
Definition Network.cpp:114
void setTimeout(int64_t timeout)
Definition Network.cpp:20
virtual int receiveBytesImplementation(char *data, int size, int flags=0)
Definition Network.cpp:10
SOCKET getClientSocket() const
clientSocket getter
Definition Network.cpp:221
Network(std::string_view ip, std::string_view port, int64_t timeout)
Definition Network.cpp:42
Wrap Container concept instance.
Definition ContainerWrapper.h:27
Definition BufferArray.cpp:11
Definition ContainerWrapper.cpp:4