Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Client server protocol V1 by nefton. (feel free to use in any way)
- //First 8 bytes of a message (consist from a packets) = magic * size_of_message
- //magic - any number (good number will be 77546)
- //NetworkClient.h
- #pragma once
- #include <string>
- #include <stdint.h>
- class NetworkClient {
- public:
- NetworkClient();
- static void WSAStart(std::string* err_str);
- static void WSAStop(std::string* err_str);
- void CreateClientSocket(std::string* err_str);
- void Connect(std::string server_ip, int port, std::string* err_str);
- void SendMessageToServer(std::string message, int magic, std::string* err_str);
- void ReceiveMessageBack(int max_message_size, std::string* message, int magic, std::string* err_str);
- void CloseConnection();
- private:
- int64_t client_socket;
- int32_t GetMessageSize(int magic, char* Buff);
- void AddMessageSize(int magic, std::string* message);
- };
- //NetworkClient_windows.cpp
- #define _WINSOCK_DEPRECATED_NO_WARNINGS
- #include <winsock2.h>
- #include <Windows.h>
- #pragma comment(lib, "Ws2_32.lib")
- #include <iostream>;
- #include "NetworkClient.h"
- NetworkClient::NetworkClient() {
- client_socket = 0;
- return;
- }
- void NetworkClient::WSAStart(std::string* err_str) {
- if (err_str != nullptr) *err_str = "";
- WSADATA ws;
- if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) {
- if (err_str != nullptr) *err_str = "WSAStartup FAILED";
- }
- return;
- }
- void NetworkClient::WSAStop(std::string* err_str) {
- if (err_str != nullptr) *err_str = "";
- if (WSACleanup() < 0) {
- if (err_str != nullptr) *err_str = "WSACleanup FAILED";
- }
- return;
- }
- void NetworkClient::CreateClientSocket(std::string* err_str) {
- *err_str = "";
- client_socket = (int64_t)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (client_socket == INVALID_SOCKET) {
- *err_str = "client_socket = INVALID_SOCKET";
- return;
- }
- return;
- }
- void NetworkClient::Connect(std::string server_ip, int port, std::string* err_str) {
- *err_str = "";
- sockaddr_in dest_addr;
- ZeroMemory(&dest_addr, sizeof(dest_addr));
- dest_addr.sin_family = AF_INET;
- dest_addr.sin_addr.S_un.S_addr = inet_addr(server_ip.c_str());
- dest_addr.sin_port = htons(port);
- if (connect((SOCKET)client_socket, (sockaddr *)&dest_addr, sizeof(dest_addr)) == SOCKET_ERROR) {
- *err_str = "connect = SOCKET_ERROR";
- }
- return;
- }
- void NetworkClient::SendMessageToServer(std::string message, int magic, std::string* err_str) {
- *err_str = "";
- //std::cout << message.size() << "\n";
- AddMessageSize(magic, &message);
- //std::cout << (int)message[0] << "|" << (int)message[1] << "|" << (int)message[2] << "|" << (int)message[3] << "\n";
- //std::cout << (int)message[4] << "|" << (int)message[5] << "|" << (int)message[6] << "|" << (int)message[7] << "\n";
- //Send message
- int sent_bytes = send((SOCKET)client_socket, message.data(), message.size(), 0);
- if (sent_bytes != message.size()) {
- *err_str = "sent_bytes != message.size()";
- }
- return;
- }
- void NetworkClient::ReceiveMessageBack(int max_message_size, std::string* message, int magic, std::string* err_str) {
- *err_str = "";
- *message = "";
- char* Buff = new char[max_message_size];
- char* buff_pointer = Buff;
- int recive_size = 0;
- int32_t expected_size = -1;
- bool fail_flag = false;
- while (true) {
- int packet_size = recv((SOCKET)client_socket, buff_pointer, max_message_size - recive_size, 0);
- if (packet_size == SOCKET_ERROR) {
- *err_str = "recv() = SOCKET_ERROR.";
- fail_flag = true;
- break;
- }
- if (packet_size == 0) {
- break;
- }
- expected_size = GetMessageSize(magic, Buff);
- if (expected_size == -1) {
- fail_flag = true;
- *err_str = "wrong expected message size.";
- break;
- }
- buff_pointer += packet_size;
- recive_size += packet_size;
- if (recive_size >= expected_size) break;
- }
- if ((fail_flag == true) || (expected_size == -1) || (recive_size != expected_size)) {
- if (recive_size != expected_size) *err_str += "recive_size != expected_size";
- delete[] Buff;
- return;
- }
- if (recive_size >= 8) *message = std::string(Buff + 8, recive_size - 8);
- delete[] Buff;
- return;
- }
- void NetworkClient::AddMessageSize(int magic, std::string* message) {
- uint64_t size = (message->size() + 8) * magic;
- std::string prefix = "01234567";
- char* p = reinterpret_cast<char*>(&size);
- for (int i = 0; i < 8; i++) prefix[i] = p[i];
- *message = prefix + *message;
- return;
- }
- int32_t NetworkClient::GetMessageSize(int magic, char* buff) {
- uint64_t* size = reinterpret_cast<uint64_t*>(buff);
- if (*size % magic != 0) return -1;
- return *size / magic;
- }
- void NetworkClient::CloseConnection() {
- closesocket(client_socket);
- client_socket = 0;
- return;
- }
- //NetworkServer.h
- #pragma once
- #include <string>
- #include <stdint.h>
- class NetworkServer {
- public:
- NetworkServer();
- static void WSAStart(std::string* err_str);
- static void WSAStop(std::string* err_str);
- void CreateServerSocket(std::string* err_str);
- void Bind(int port, std::string interface_str, std::string* err_str);
- void StartListen(int max_queue, std::string* err_str);
- void Accept(std::string* client_ip, std::string* err_str);
- void ReceiveMessage(int max_message_size, std::string* message, int magic, std::string* err_str);
- void SendMessageBack(std::string message, int magic, std::string* err_str);
- void CloseConnection();
- void CloseServerSocket();
- //private:
- int64_t server_socket;
- int64_t new_connection_socket;
- int32_t GetMessageSize(int magic, char* Buff);
- void AddMessageSize(int magic, std::string* message);
- };
- //NetworkServer_linux.cpp
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <iostream>
- #include "NetworkServer.h"
- NetworkServer::NetworkServer() {
- server_socket = 0;
- new_connection_socket = 0;
- return;
- }
- void NetworkServer::CloseServerSocket() {
- close(server_socket);
- server_socket = 0;
- return;
- }
- void NetworkServer::CreateServerSocket(std::string* err_str) {
- *err_str = "";
- server_socket = (int64_t)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (server_socket < 0) {
- *err_str = "server_socket = INVALID_SOCKET";
- return;
- }
- return;
- }
- void NetworkServer::Bind(int port, std::string interface_str, std::string* err_str) {
- *err_str = "";
- struct sockaddr_in serv_addr;
- bzero((char *)&serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- if (interface_str == "any") {
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- }
- else {
- serv_addr.sin_addr.s_addr = inet_addr(interface_str.c_str());
- }
- serv_addr.sin_port = htons(port);
- if (bind((int)server_socket, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
- *err_str = "bind = SOCKET_ERROR";
- }
- return;
- }
- void NetworkServer::StartListen(int max_queue, std::string* err_str) {
- *err_str = "";
- if (listen((int)server_socket, max_queue) < 0) {
- *err_str = "listem = ERROR";
- }
- return;
- }
- void NetworkServer::Accept(std::string* client_ip, std::string* err_str) {
- *err_str = "";
- new_connection_socket = 0;
- sockaddr_in remote_addr;
- socklen_t remote_addr_len = sizeof(sockaddr_in);
- bzero((char *)&remote_addr, sizeof(remote_addr));
- new_connection_socket = (uint64_t)accept((int)server_socket, (sockaddr*)&remote_addr, &remote_addr_len);
- if (new_connection_socket < 0) {
- *err_str = "new_connection_socket = INVALID_SOCKET";
- new_connection_socket = 0;
- }
- *client_ip = std::string(inet_ntoa(remote_addr.sin_addr));
- return;
- }
- void NetworkServer::ReceiveMessage(int max_message_size, std::string* message, int magic, std::string* err_str) {
- *err_str = "";
- *message = "";
- char* Buff = new char[max_message_size];
- char* buff_pointer = Buff;
- int recive_size = 0;
- int32_t expected_size = -1;
- bool fail_flag = false;
- while (true) {
- int packet_size = recv((int)new_connection_socket, buff_pointer, max_message_size - recive_size, 0);
- if (packet_size < 0) {
- *err_str = "recv() = SOCKET_ERROR.";
- fail_flag = true;
- break;
- }
- if (packet_size == 0) {
- *err_str = "recv() = 0 (client close connection).";
- fail_flag = true;
- break;
- }
- expected_size = GetMessageSize(magic, Buff);
- if (expected_size == -1) {
- *err_str = "wrong expected message size. packet_size = " + std::to_string(packet_size);
- *message = std::string(Buff, packet_size); //interesting what stuff they send for me
- fail_flag = true;
- break;
- }
- buff_pointer += packet_size;
- recive_size += packet_size;
- if (recive_size >= expected_size) break;
- }
- if (fail_flag == true) {
- delete[] Buff;
- return;
- }
- if (recive_size >= 8) *message = std::string(Buff + 8, recive_size - 8);
- delete[] Buff;
- return;
- }
- void NetworkServer::SendMessageBack(std::string message, int magic, std::string* err_str) {
- *err_str = "";
- AddMessageSize(magic, &message);
- //Send answer
- int sent_bytes = send((int)new_connection_socket, message.c_str(), message.size(), 0);
- if (sent_bytes != message.size()) {
- *err_str = "sent_bytes != message.size()";
- }
- return;
- }
- void NetworkServer::AddMessageSize(int magic, std::string* message) {
- uint64_t size = (message->size() + 8) * magic;
- std::string prefix = "01234567";
- char* p = reinterpret_cast<char*>(&size);
- for (int i = 0; i < 8; i++) prefix[i] = p[i];
- *message = prefix + *message;
- return;
- }
- int32_t NetworkServer::GetMessageSize(int magic, char* buff) {
- uint64_t* size = reinterpret_cast<uint64_t*>(buff);
- if (*size % magic != 0) return -1;
- return *size / magic;
- }
- void NetworkServer::CloseConnection() {
- close(new_connection_socket);
- new_connection_socket = 0;
- return;
- }
- //NetworkServer_windows.cpp
- #define _WINSOCK_DEPRECATED_NO_WARNINGS
- #include <winsock2.h>
- #include <Windows.h>
- #pragma comment(lib, "Ws2_32.lib")
- #include <iostream>;
- #include "NetworkServer.h"
- NetworkServer::NetworkServer() {
- server_socket = 0;
- new_connection_socket = 0;
- return;
- }
- void NetworkServer::WSAStart(std::string* err_str) {
- if (err_str != nullptr) *err_str = "";
- WSADATA ws;
- if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) {
- if (err_str != nullptr) *err_str = "WSAStartup FAILED";
- }
- return;
- }
- void NetworkServer::WSAStop(std::string* err_str) {
- if (err_str != nullptr) *err_str = "";
- if (WSACleanup() < 0) {
- if (err_str != nullptr) *err_str = "WSACleanup FAILED";
- }
- return;
- }
- void NetworkServer::CloseServerSocket() {
- closesocket((SOCKET)server_socket);
- server_socket = 0;
- return;
- }
- void NetworkServer::CreateServerSocket(std::string* err_str) {
- *err_str = "";
- server_socket = (int64_t)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (server_socket == INVALID_SOCKET) {
- *err_str = "server_socket = INVALID_SOCKET";
- return;
- }
- return;
- }
- void NetworkServer::Bind(int port, std::string interface_str, std::string* err_str) {
- *err_str = "";
- sockaddr_in addr;
- ZeroMemory(&addr, sizeof(addr));
- addr.sin_family = AF_INET;
- if (interface_str == "any") {
- addr.sin_addr.S_un.S_addr = INADDR_ANY;
- }
- else {
- addr.sin_addr.S_un.S_addr = inet_addr(interface_str.c_str());
- }
- addr.sin_port = htons(port);
- if (bind((SOCKET)server_socket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
- *err_str = "bind = SOCKET_ERROR";
- }
- return;
- }
- void NetworkServer::StartListen(int max_queue, std::string* err_str) {
- *err_str = "";
- if (listen((SOCKET)server_socket, max_queue) != 0) {
- *err_str = "listem = ERROR";
- }
- return;
- }
- void NetworkServer::Accept(std::string* client_ip, std::string* err_str) {
- *err_str = "";
- new_connection_socket = 0;
- sockaddr_in remote_addr;
- int remote_addr_len = sizeof(sockaddr_in);
- ZeroMemory(&remote_addr, sizeof(sockaddr_in));
- new_connection_socket = (uint64_t)accept((SOCKET)server_socket, (sockaddr*)&remote_addr, &remote_addr_len);
- if (new_connection_socket == INVALID_SOCKET) {
- *err_str = "new_connection_socket = INVALID_SOCKET";
- new_connection_socket = 0;
- }
- *client_ip = std::string(inet_ntoa(remote_addr.sin_addr));
- return;
- }
- void NetworkServer::ReceiveMessage(int max_message_size, std::string* message, int magic, std::string* err_str) {
- *err_str = "";
- *message = "";
- char* Buff = new char[max_message_size];
- char* buff_pointer = Buff;
- int recive_size = 0;
- int32_t expected_size = -1;
- int packet_size = 0;
- bool fail_flag = false;
- while (true) {
- packet_size = recv((SOCKET)new_connection_socket, buff_pointer, max_message_size - recive_size, 0);
- if (packet_size == SOCKET_ERROR) {
- *err_str = "recv() = SOCKET_ERROR.";
- fail_flag = true;
- break;
- }
- if (packet_size == 0) {
- *err_str = "recv() = 0 (client close connection).";
- fail_flag = true;
- break;
- }
- expected_size = GetMessageSize(magic, Buff);
- if (expected_size == -1) {
- *err_str = "wrong expected message size. packet_size = " + std::to_string(packet_size);
- *message = std::string(Buff, packet_size); //interesting what stuff they send for me
- fail_flag = true;
- break;
- }
- buff_pointer += packet_size;
- recive_size += packet_size;
- if (recive_size >= expected_size) break;
- }
- if (fail_flag == true) {
- delete[] Buff;
- return;
- }
- if (recive_size >= 8) *message = std::string(Buff + 8, recive_size - 8);
- delete[] Buff;
- return;
- }
- void NetworkServer::SendMessageBack(std::string message, int magic, std::string* err_str) {
- *err_str = "";
- AddMessageSize(magic, &message);
- //Send answer
- int sent_bytes = send((SOCKET)new_connection_socket, message.c_str(), message.size(), 0);
- if (sent_bytes != message.size()) {
- *err_str = "sent_bytes != message.size()";
- }
- return;
- }
- void NetworkServer::AddMessageSize(int magic, std::string* message) {
- uint64_t size = (message->size() + 8) * magic;
- std::string prefix = "01234567";
- char* p = reinterpret_cast<char*>(&size);
- for (int i = 0; i < 8; i++) prefix[i] = p[i];
- *message = prefix + *message;
- return;
- }
- int32_t NetworkServer::GetMessageSize(int magic, char* buff) {
- uint64_t* size = reinterpret_cast<uint64_t*>(buff);
- if (*size % magic != 0) return -1;
- return *size / magic;
- }
- void NetworkServer::CloseConnection() {
- closesocket(new_connection_socket);
- new_connection_socket = 0;
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement