Advertisement
Vincent38190

SocketServer.h

Mar 9th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.00 KB | None | 0 0
  1. #undef UNICODE
  2.  
  3. #define WIN32_LEAN_AND_MEAN
  4.  
  5. #include <windows.h>
  6. #include <winsock2.h>
  7. #include <ws2tcpip.h>
  8. #include <cstdlib>
  9. #include <cstdio>
  10. #include <cstdarg>
  11. #include <vector>
  12.  
  13. #pragma comment (lib, "Ws2_32.lib")
  14.  
  15. #define DEFAULT_BUFLEN 1024
  16. #define MAX_THREADS 20
  17.  
  18. using cstring = const char*;
  19.  
  20. char tmp[DEFAULT_BUFLEN];
  21. cstring MAKESTRING(cstring str, ...)
  22. {
  23.     ZeroMemory(tmp, DEFAULT_BUFLEN);
  24.     va_list va;
  25.     va_start(va, str);
  26.     vsprintf_s(tmp, str, va);
  27.     va_end(va);
  28.     return tmp;
  29. }
  30.  
  31. typedef struct data
  32. {
  33.     PVOID arg;
  34.     PVOID var;
  35.     PDWORD byteread = 0;
  36.     DWORD varsize;
  37.     PVOID SocketServerClass;
  38.     void(*function)(PVOID);
  39. }DATA, *PDATA;
  40.  
  41.  
  42. DWORD WINAPI myfunction(PVOID args);
  43.  
  44.  
  45.  
  46. class SocketServer
  47. {
  48. public:
  49.  
  50.     SocketServer(){}
  51.     DWORD Setup(cstring port)
  52.     {
  53.         try {
  54.             int iResult = 0;
  55.             //Initialize Winsock
  56.             iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  57.             if (iResult != 0)
  58.                 throw MAKESTRING("WSAStartup failed with error: %d\n", iResult);
  59.  
  60.             ZeroMemory(&hints, sizeof(hints));
  61.             hints.ai_family = AF_INET;
  62.             hints.ai_socktype = SOCK_STREAM;
  63.             hints.ai_protocol = IPPROTO_TCP;
  64.             hints.ai_flags = AI_PASSIVE;
  65.  
  66.             // Resolve the server address and port
  67.             iResult = getaddrinfo(NULL, port, &hints, &result);
  68.             if (iResult != 0)
  69.                 throw MAKESTRING("getaddrinfo failed with error: %d\n", iResult);
  70.  
  71.             // Create a SOCKET for connecting to server
  72.             ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
  73.             if (ListenSocket == INVALID_SOCKET)
  74.                 throw MAKESTRING("socket failed with error: %ld\n", WSAGetLastError());
  75.  
  76.             // Setup the TCP listening socket
  77.             iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
  78.             if (iResult == SOCKET_ERROR)
  79.                 throw MAKESTRING("bind failed with error: %d\n", WSAGetLastError());
  80.             freeaddrinfo(result);
  81.             result = NULL;
  82.  
  83.             iResult = listen(ListenSocket, SOMAXCONN);
  84.             if (iResult == SOCKET_ERROR)
  85.                 throw MAKESTRING("listen failed with error: %d\n", WSAGetLastError());
  86.  
  87.             // Accept a client socket
  88.             ClientSocket = accept(ListenSocket, NULL, NULL);
  89.             if (ClientSocket == INVALID_SOCKET)
  90.                 throw MAKESTRING("accept failed with error: %d\n", WSAGetLastError());
  91.  
  92.             // No longer need server socket
  93.             closesocket(ListenSocket);
  94.             ListenSocket = NULL;
  95.             return 0;
  96.         }
  97.         catch (cstring str)
  98.         {
  99.             printf("%s", str);
  100.             SocketServer::~SocketServer();
  101.             return (DWORD)str[0];
  102.         }
  103.     }
  104.     void Shutdown() { SocketServer::~SocketServer();}
  105.     ~SocketServer()
  106.     {
  107.         shutdown(ClientSocket, SD_SEND);
  108.         if(result != NULL)
  109.             freeaddrinfo(result);
  110.         if (ListenSocket != NULL)
  111.         closesocket(ListenSocket);
  112.         closesocket(ClientSocket);
  113.         WSACleanup();
  114.     }
  115.     template<typename type>
  116.     type Read()
  117.     {
  118.         type temp;
  119.         int iResult;
  120.         do {
  121.             iResult = recv(ClientSocket, (char*)&temp, sizeof(temp), 0);
  122.         } while (iResult == 0);
  123.        
  124.         return temp;
  125.     }
  126.     DWORD AsyncRead(PVOID var,PDWORD byteread,DWORD varsize, void (*function)(PVOID), PVOID arg)
  127.     {
  128.         PDATA data = (PDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DATA));
  129.         data->arg = arg;
  130.         data->byteread = byteread;
  131.         data->var = var;
  132.         data->varsize = varsize;
  133.         data->function = function;
  134.         data->SocketServerClass = (PVOID) this;
  135.         ThreadID.push_back(0);
  136.         HandleID.push_back(CreateThread(NULL, 0, myfunction, (PVOID)data, 0, &ThreadID[ThreadID.size()-1]));
  137.         return ThreadID[ThreadID.size() - 1];
  138.     }
  139.     void WaitForAllThread()
  140.     {
  141.         WaitForMultipleObjects(ThreadID.size(),HandleID.data(), TRUE, INFINITE);
  142.         return;
  143.     }
  144.     void WaitForThread(DWORD _ThreadID)
  145.     {
  146.         int i = 0;
  147.         for (; i < ThreadID.size(); i++)
  148.             if (ThreadID[i] == _ThreadID) break;
  149.         WaitForSingleObject(HandleID[i], INFINITE);
  150.         return;
  151.     }
  152.     SOCKET getClientSocket() const { return ClientSocket; }
  153.     size_t Read(cstring buffer, size_t bufferlen)
  154.     {
  155.         int iResult;
  156.         do {
  157.             iResult = recv(ClientSocket,(char*) buffer, bufferlen, 0);
  158.         } while (iResult <= 0);
  159.         return iResult;
  160.     }
  161.     template<typename type>
  162.     int Write(type data)
  163.     {
  164.         int iSendResult = send(ClientSocket,(char*) &data, sizeof(data), 0);
  165.         if (iSendResult == SOCKET_ERROR)
  166.             throw MAKESTRING("send failed with error: %d\n", WSAGetLastError());
  167.         return iSendResult;
  168.     }
  169.     int Write(cstring buffer, size_t bufferlen)
  170.     {
  171.         int iSendResult = send(ClientSocket, buffer, bufferlen, 0);
  172.         if (iSendResult == SOCKET_ERROR)
  173.             throw MAKESTRING("send failed with error: %d\n", WSAGetLastError());
  174.         return iSendResult;
  175.     }
  176.  
  177.  
  178. private:
  179.  
  180.     std::vector<DWORD> ThreadID;
  181.     std::vector<HANDLE> HandleID;
  182.     struct addrinfo *result = NULL;
  183.     struct addrinfo hints;
  184.     WSADATA wsaData;
  185.     SOCKET ListenSocket = INVALID_SOCKET;
  186.     SOCKET ClientSocket = INVALID_SOCKET;
  187.  
  188. };
  189.  
  190. DWORD WINAPI myfunction(PVOID args)
  191. {
  192.     PDATA data = (PDATA)args;
  193.     SocketServer* socket = (SocketServer*)data->SocketServerClass;
  194.     do {
  195.         *data->byteread = recv(socket->getClientSocket(), (char*)data->var, data->varsize, 0);
  196.     } while (data->byteread == 0);
  197.     data->function(data->arg);
  198.     return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement