Advertisement
massacring

WebSocketClient.cpp

Jul 23rd, 2024 (edited)
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include "WebSocketClient.h"
  2.  
  3. WebSocketClient::WebSocketClient() {
  4.     hSession = WinHttpOpen(L"WebSocket Client/Andromeda",
  5.         WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY,
  6.         WINHTTP_NO_PROXY_NAME,
  7.         WINHTTP_NO_PROXY_BYPASS, 0);
  8. }
  9.  
  10. WebSocketClient::~WebSocketClient() {
  11.     if (hWebSocket) WinHttpWebSocketClose(hWebSocket, WINHTTP_WEB_SOCKET_SUCCESS_CLOSE_STATUS, NULL, 0);
  12.     if (hRequest) WinHttpCloseHandle(hRequest);
  13.     if (hConnect) WinHttpCloseHandle(hConnect);
  14.     if (hSession) WinHttpCloseHandle(hSession);
  15. }
  16.  
  17. bool WebSocketClient::Connect(const wchar_t* host, int port, const wchar_t* path) {
  18.     hConnect = WinHttpConnect(hSession, host, port, 0);
  19.     if (!hConnect) return false;
  20.  
  21.     hRequest = WinHttpOpenRequest(hConnect, L"GET", path,
  22.         NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
  23.     if (!hRequest) return false;
  24.  
  25.     // Request protocol upgrade from HTTP to WebSocket.
  26.     WinHttpSetOption(hRequest, WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET, 0, 0);
  27.  
  28.     // Send the request.
  29.     if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0,
  30.         WINHTTP_NO_REQUEST_DATA, 0, 0, 0))
  31.         return false;
  32.  
  33.     if (!WinHttpReceiveResponse(hRequest, 0))
  34.         return false;
  35.  
  36.     hWebSocket = WinHttpWebSocketCompleteUpgrade(hRequest, NULL);
  37.     if (!hWebSocket)
  38.         return false;
  39.  
  40.     // The hRequest handle is not needed anymore. The hWebSocket handle
  41.     // will be used to represent the connection.
  42.     WinHttpCloseHandle(hRequest);
  43.     hRequest = NULL;
  44.  
  45.     return true;
  46. }
  47.  
  48. bool WebSocketClient::Send(const json& j) const {
  49.     std::string message = j.dump();
  50.     return WinHttpWebSocketSend(hWebSocket, WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE,
  51.         (PVOID)message.c_str(), message.length()) == NO_ERROR;
  52. }
  53.  
  54. std::string WebSocketClient::Receive() const {
  55.     char buffer[1024]{};
  56.     DWORD bytesRead = 0;
  57.     WINHTTP_WEB_SOCKET_BUFFER_TYPE bufferType;
  58.  
  59.     if (WinHttpWebSocketReceive(hWebSocket, buffer, sizeof(buffer), &bytesRead, &bufferType) == NO_ERROR) {
  60.         return std::string(buffer, bytesRead);
  61.     }
  62.     return "";
  63. }
  64.  
  65. bool WebSocketClient::CheckConnection() const {
  66.     // How?
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement