TestActor.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. #include "TestActor.h"
  3. #include "Interfaces/IPv4/IPv4Address.h"
  4. #include "SocketSubsystem.h"
  5. #include "SocketTypes.h"
  6. bool ATestActor::BeginConnect()
  7. {
  8. ISocketSubsystem* System = ISocketSubsystem::Get();
  9. Host = System->CreateSocket(NAME_Stream, TEXT("default"), false);
  10. Host->SetReuseAddr(true);
  11. uint32 IPAddr;
  12. Addr->GetIp(IPAddr);
  13. auto OutPort = Addr->GetPort();
  14. if (!Host->Connect(*Addr))
  15. {
  16. ESocketErrors ErrorCode = System->GetLastErrorCode();
  17. UE_LOG(LogTemp, Log, TEXT("Host Connect Faild %s"), System->GetSocketError(ErrorCode));
  18. return false;
  19. }
  20. return true;
  21. }
  22. bool ATestActor::SendMessage(const FString& Msg)
  23. {
  24. auto Data = Msg.GetCharArray().GetData();
  25. int32 Size = FCString::Strlen(Data) + 1;
  26. int32 Send = 0;
  27. if (Host->Send((uint8*)TCHAR_TO_UTF8(Data), Size, Send))
  28. {
  29. UE_LOG(LogTemp, Log, TEXT("Send Message Success"));
  30. return true;
  31. }
  32. UE_LOG(LogTemp, Log, TEXT("Send Message Faild"));
  33. return false;
  34. }
  35. void ATestActor::BeginPlay()
  36. {
  37. Super::BeginPlay();
  38. FIPv4Address IpAddr;
  39. FIPv4Address::Parse(Ip, IpAddr);
  40. ISocketSubsystem* System = ISocketSubsystem::Get();
  41. Addr = System->CreateInternetAddr().ToSharedPtr();
  42. Addr->SetIp(IpAddr.Value);
  43. Addr->SetPort(Port);
  44. Thread = FRunnableThread::Create(new FSocketListener(Addr.Get()), TEXT("Listener"));
  45. }
  46. void ATestActor::EndPlay(const EEndPlayReason::Type EndPlayReason)
  47. {
  48. if (Thread)
  49. {
  50. Thread->Kill();
  51. Thread = nullptr;
  52. }
  53. ISocketSubsystem* System = ISocketSubsystem::Get();
  54. if (Host)
  55. {
  56. Host->Close();
  57. System->DestroySocket(Host);
  58. Host = nullptr;
  59. }
  60. }
  61. bool FSocketListener::Init()
  62. {
  63. return true;
  64. }
  65. uint32 FSocketListener::Run()
  66. {
  67. do
  68. {
  69. InitSocket();
  70. } while (Socket == nullptr);
  71. TArray<uint8> ReceiveData;
  72. uint8 Element = 0;
  73. int32 BytesRead(0);
  74. while (bEnabled)
  75. {
  76. // 接受客户端连接
  77. if (AcceptClient())
  78. {
  79. // 处理客户端数据
  80. ProcessClientData();
  81. }
  82. }
  83. return 0;
  84. }
  85. void FSocketListener::InitSocket()
  86. {
  87. ISocketSubsystem* System = ISocketSubsystem::Get();
  88. Socket = System->CreateSocket(NAME_Stream, TEXT("default"), false);
  89. Socket->SetReuseAddr(true);
  90. if(!Socket->Bind(*Addr))
  91. {
  92. System->DestroySocket(Socket);
  93. Socket = nullptr;
  94. return;
  95. }
  96. Socket->Listen(5);
  97. }
  98. bool FSocketListener::AcceptClient()
  99. {
  100. // 检查是否有待处理的连接
  101. if (!Socket->Wait(ESocketWaitConditions::WaitForRead, FTimespan::FromSeconds(2)))
  102. {
  103. return false;
  104. }
  105. // 接受新连接
  106. ClientSocket = Socket->Accept(TEXT("ClientConnection"));
  107. if (!ClientSocket)
  108. {
  109. return false;
  110. }
  111. UE_LOG(LogTemp, Log, TEXT("New client connected"));
  112. return true;
  113. }
  114. void FSocketListener::ProcessClientData()
  115. {
  116. TArray<uint8> ReceiveData;
  117. ReceiveData.SetNumUninitialized(1024);
  118. uint32 BytesRead = 0;
  119. // 接收数据
  120. while (ClientSocket->HasPendingData(BytesRead))
  121. {
  122. int32 Read = 0;
  123. if (ClientSocket->Recv(ReceiveData.GetData(), ReceiveData.Num(), Read))
  124. {
  125. if (Read > 0)
  126. {
  127. // 转换为字符串 (注意: 实际应用中需要处理二进制数据)
  128. FString ReceivedString = FString(UTF8_TO_TCHAR(reinterpret_cast<const char*>(ReceiveData.GetData())));
  129. UE_LOG(LogTemp, Warning, TEXT("Received: %s"), *ReceivedString.Left(Read));
  130. }
  131. }
  132. }
  133. // 关闭客户端连接
  134. ClientSocket->Close();
  135. ISocketSubsystem::Get()->DestroySocket(ClientSocket);
  136. ClientSocket = nullptr;
  137. }