Newer
Older
SkyFrontier-Project-IADE-UE4-3D / Source / SkyFrontier / Private / TCPClient.cpp
@Genexuz Genexuz on 6 Dec 2022 3 KB idk matchmaking
  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. #include "TCPClient.h"
  3. #include "MyPlayerState.h"
  4. #include "Sockets.h"
  5. #include "SocketSubsystem.h"
  6. #include "Interfaces/IPv4/IPv4Address.h"
  7. #include "TraceServices/Model/Diagnostics.h"
  8. TCPClient::TCPClient(AMyPlayerState* pState)
  9. {
  10. Thread = FRunnableThread::Create(this, TEXT("TCPClientThread"), 0, TPri_Normal); PlayerState = pState;
  11. }
  12. TCPClient::~TCPClient()
  13. {
  14. TCPClient::Stop(); delete Thread;
  15. }
  16. void TCPClient::Stop()
  17. {
  18. running = false;
  19. }
  20. bool TCPClient::IsConnected()
  21. {
  22. return connected;
  23. }
  24. bool TCPClient::Init()
  25. {
  26. Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
  27. int32 NewSize = 0;
  28. Socket->SetReceiveBufferSize(1024, NewSize);
  29. FIPv4Address matchmakingServerIP(127, 0, 0, 1);
  30. TSharedRef<FInternetAddr> matchmakingServer = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
  31. matchmakingServer->SetIp(matchmakingServerIP.Value);
  32. matchmakingServer->SetPort(8856);
  33. connected = Socket->Connect(*matchmakingServer);
  34. if (connected)
  35. {
  36. UE_LOG(LogTemp, Log, TEXT("CONNECTED!"));
  37. FString serialized = TEXT("g|#");
  38. TCHAR *serializedChar = serialized.GetCharArray().GetData();
  39. int32 size = FCString::Strlen(serializedChar);
  40. int32 sent = 0;
  41. bool successful = Socket->Send((uint8*)TCHAR_TO_UTF8(serializedChar), size, sent);
  42. if (successful)
  43. {UE_LOG(LogTemp, Log, TEXT("MESSAGE SENT!"));
  44. return true;
  45. }
  46. else
  47. {
  48. UE_LOG(LogTemp, Log, TEXT("ERROR: NOT CONNECTED!"));return false;
  49. }
  50. }
  51. return 0;
  52. }
  53. uint32 TCPClient::Run()
  54. {
  55. running = true;
  56. TArray<uint8> ReceivedData;
  57. while (running)
  58. {
  59. uint32 Size = 0;
  60. if (Socket->HasPendingData(Size))
  61. {
  62. ReceivedData.Init(0, Size);
  63. int32 Read = 0;
  64. Socket->Recv(ReceivedData.GetData(), ReceivedData.Num(), Read);
  65. FString ServerMessage = FString(UTF8_TO_TCHAR(ReceivedData.GetData()));
  66. UE_LOG(LogTemp, Log, TEXT("RECEIVED: %s"), *ServerMessage);
  67. if ((ServerMessage[0] == 's') && (PlayerState))
  68. {
  69. PlayerState->UpdateSessionsList(ServerMessage);
  70. }
  71. else if((ServerMessage[0] == 'o') && (PlayerState))
  72. {
  73. TArray<FString> Out;
  74. ServerMessage.ParseIntoArray(Out, TEXT("|"), true);
  75. FSessionInfo session;
  76. session.id = -1;
  77. session.name = "";
  78. session.serverip = Out[1];
  79. session.serverport = FCString::Atoi(*Out[2]);
  80. PlayerState->ConnectToGameServer(session);
  81. }
  82. }
  83. }
  84. return 0;
  85. }
  86. void TCPClient::CreateNewGameSession(FString sname)
  87. {
  88. FString serialized = "c|" + sname + "|#";
  89. TCHAR *serializedChar = serialized.GetCharArray().GetData();
  90. int32 size = FCString::Strlen(serializedChar);
  91. int32 sent = 0;
  92. bool successful = Socket->Send((uint8*) TCHAR_TO_UTF8(serializedChar), size, sent);
  93. if (successful)
  94. UE_LOG(LogTemp, Log, TEXT("MESSAGE SENT!!!!"));
  95. }
  96. void TCPClient::JoinGameSession(int sID)
  97. {
  98. FString serialized = "j|" + FString::FromInt(sID) + "|#";
  99. TCHAR *serializedChar = serialized.GetCharArray().GetData();
  100. int32 size = FCString::Strlen(serializedChar);
  101. int32 sent = 0;
  102. bool successful = Socket->Send((uint8*) TCHAR_TO_UTF8(serializedChar), size, sent);
  103. if (successful)
  104. UE_LOG(LogTemp, Log, TEXT("MESSAGE SENT!!!!"));
  105. }