From b78ece8919f1010603752b35639922306b0f45c7 Mon Sep 17 00:00:00 2001 From: Xiphoseer Date: Wed, 1 May 2024 23:41:59 +0200 Subject: [PATCH] wip: Http Client experiments --- dChatClient/CMakeLists.txt | 3 +++ dChatClient/ChatHttpClient.cpp | 32 +++++++++++++++++++++++ thirdparty/raknet/CMakeLists.txt | 8 +++++- thirdparty/raknet/Source/TCPInterface.cpp | 27 ++++++++++++------- thirdparty/raknet/Source/TCPInterface.h | 5 ++-- 5 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 dChatClient/ChatHttpClient.cpp diff --git a/dChatClient/CMakeLists.txt b/dChatClient/CMakeLists.txt index ed6c639c..0ab61894 100644 --- a/dChatClient/CMakeLists.txt +++ b/dChatClient/CMakeLists.txt @@ -1,2 +1,5 @@ add_executable(ChatClient ChatClient.cpp) target_link_libraries(ChatClient raknet dCommon) + +add_executable(ChatHttpClient ChatHttpClient.cpp) +target_link_libraries(ChatHttpClient raknet dCommon) diff --git a/dChatClient/ChatHttpClient.cpp b/dChatClient/ChatHttpClient.cpp new file mode 100644 index 00000000..f9fb6bb0 --- /dev/null +++ b/dChatClient/ChatHttpClient.cpp @@ -0,0 +1,32 @@ +#include + +#include +#include +#include + +int main(int argc, const char** argv) { + std::cout << "Hello World!" << std::endl; + + TCPInterface tcp; + if (!tcp.Start(0, 0)) { + std::cerr << "Failed to start TCP Interface" << std::endl; + return 1; + } + + SystemAddress addr = tcp.Connect("127.0.0.1", 8000); + std::cout << "addr: " << addr.ToString() << std::endl; + + std::string req = "\ +GET /helloFromRakNet.txt HTTP/1.1\r\n\ +User-Agent: raknet / 3.25\r\n\ +\r\n"; + std::cout << req; + + tcp.Send(req.c_str(), req.size(), addr); + + RakSleep(500); + + tcp.CloseConnection(addr); + + return 0; +} diff --git a/thirdparty/raknet/CMakeLists.txt b/thirdparty/raknet/CMakeLists.txt index d4dd1e60..9ed639e3 100644 --- a/thirdparty/raknet/CMakeLists.txt +++ b/thirdparty/raknet/CMakeLists.txt @@ -72,8 +72,14 @@ Source/RakThread.h Source/SuperFastHash.h S Source/HTTPConnection.h Kbhit.h ) - add_library(raknet STATIC ${RAKNET_SOURCES}) + +find_package(OpenSSL COMPONENTS SSL) +if(OpenSSL_FOUND) +target_compile_definitions(raknet PUBLIC OPEN_SSL_CLIENT_SUPPORT) +target_link_libraries(raknet PRIVATE OpenSSL::SSL) +endif() + target_compile_options(raknet PRIVATE $<$,$,$>: -w> diff --git a/thirdparty/raknet/Source/TCPInterface.cpp b/thirdparty/raknet/Source/TCPInterface.cpp index c8238c1b..f6b04c87 100644 --- a/thirdparty/raknet/Source/TCPInterface.cpp +++ b/thirdparty/raknet/Source/TCPInterface.cpp @@ -198,6 +198,7 @@ SystemAddress TCPInterface::Connect(const char* host, unsigned short remotePort, remoteClient->systemAddress.binaryAddress=inet_addr(host); remoteClient->systemAddress.port=remotePort; InsertRemoteClient(remoteClient); + WaitForPendingClients(); return remoteClient->systemAddress; } else @@ -223,7 +224,7 @@ void TCPInterface::StartSSLClient(SystemAddress systemAddress) if (ctx==0) { SSLeay_add_ssl_algorithms(); - meth = SSLv2_client_method(); + meth = SSLv23_client_method(); SSL_load_error_strings(); ctx = SSL_CTX_new (meth); RakAssert(ctx!=0); @@ -243,12 +244,14 @@ bool TCPInterface::IsSSLActive(SystemAddress systemAddress) #endif void TCPInterface::Send( const char *data, unsigned length, SystemAddress systemAddress ) { + printf("TCP Send %d, %d, %p\n", isStarted, remoteClients.Size(), data); if (isStarted==false) return; if (remoteClients.Size()==0) return; if (data==0) return; + printf("Acquiring lock\n"); Packet *p=outgoingMessages.WriteLock(); p->length=length; p->data = (unsigned char*) rakMalloc( p->length ); @@ -347,6 +350,7 @@ void TCPInterface::DeleteRemoteClient(RemoteClient *remoteClient, fd_set *except void TCPInterface::InsertRemoteClient(RemoteClient* remoteClient) { + printf("new remote client\n"); remoteClientsInsertionQueueMutex.Lock(); remoteClientsInsertionQueue.Push(remoteClient); remoteClientsInsertionQueueMutex.Unlock(); @@ -423,14 +427,7 @@ RAK_THREAD_DECLARATION(ConnectionAttemptLoop) tcpInterface->InsertRemoteClient(remoteClient); // Wait for the other thread to pick up the remote client - bool isEmpty; - do - { - RakSleep(30); - tcpInterface->remoteClientsInsertionQueueMutex.Lock(); - isEmpty=tcpInterface->remoteClientsInsertionQueue.IsEmpty(); - tcpInterface->remoteClientsInsertionQueueMutex.Unlock(); - } while(isEmpty==false && tcpInterface->threadRunning); + tcpInterface->WaitForPendingClients(); // Notify user that the connection attempt has completed. if (tcpInterface->threadRunning) @@ -442,6 +439,16 @@ RAK_THREAD_DECLARATION(ConnectionAttemptLoop) return 0; } +void TCPInterface::WaitForPendingClients() { + bool isEmpty; + do + { + RakSleep(30); + remoteClientsInsertionQueueMutex.Lock(); + isEmpty=remoteClientsInsertionQueue.IsEmpty(); + remoteClientsInsertionQueueMutex.Unlock(); + } while(isEmpty==false && threadRunning); +} RAK_THREAD_DECLARATION(UpdateTCPInterfaceLoop) { @@ -700,7 +707,7 @@ RAK_THREAD_DECLARATION(UpdateTCPInterfaceLoop) } #if defined(OPEN_SSL_CLIENT_SUPPORT) -void RemoteClient::InitSSL(SSL_CTX* ctx, SSL_METHOD *meth) +void RemoteClient::InitSSL(SSL_CTX* ctx, const SSL_METHOD *meth) { (void) meth; diff --git a/thirdparty/raknet/Source/TCPInterface.h b/thirdparty/raknet/Source/TCPInterface.h index 9a942d21..fc37b120 100644 --- a/thirdparty/raknet/Source/TCPInterface.h +++ b/thirdparty/raknet/Source/TCPInterface.h @@ -128,6 +128,7 @@ protected: friend RAK_THREAD_DECLARATION(UpdateTCPInterfaceLoop); friend RAK_THREAD_DECLARATION(ConnectionAttemptLoop); + void WaitForPendingClients(); void DeleteRemoteClient(RemoteClient *remoteClient, fd_set *exceptionFD); void InsertRemoteClient(RemoteClient* remoteClient); SOCKET SocketConnect(const char* host, unsigned short remotePort); @@ -141,7 +142,7 @@ protected: #if defined(OPEN_SSL_CLIENT_SUPPORT) SSL_CTX* ctx; - SSL_METHOD *meth; + const SSL_METHOD *meth; DataStructures::SingleProducerConsumer startSSL; DataStructures::List activeSSLConnections; #endif @@ -160,7 +161,7 @@ struct RemoteClient #if defined(OPEN_SSL_CLIENT_SUPPORT) SSL* ssl; - void InitSSL(SSL_CTX* ctx, SSL_METHOD *meth); + void InitSSL(SSL_CTX* ctx, const SSL_METHOD *meth); void DisconnectSSL(void); void FreeSSL(void); void Send(const char *data, unsigned int length);