-
Notifications
You must be signed in to change notification settings - Fork 1
/
ClientSocket.cpp
125 lines (101 loc) · 2.58 KB
/
ClientSocket.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Fill out your copyright notice in the Description page of Project Settings.
#include "ClientSocket.h"
#include "HoTGameInstance.h"
#include "VRPlayerController_Base.h"
#include <queue>
#pragma region Main Thread Code
ClientSocket::ClientSocket(UHoTGameInstance* Inst)
{
gameInst = Inst;
if (ConnectServer())
{
Thread = FRunnableThread::Create(this, TEXT("Network Thread"));
}
}
ClientSocket::~ClientSocket()
{
if (Thread)
{
// 스레드 종료
Thread->WaitForCompletion();
Thread->Kill();
delete Thread;
}
}
#pragma endregion
bool ClientSocket::Init()
{
UE_LOG(LogNet, Warning, TEXT("Thread has been initialized"));
return true;
}
uint32 ClientSocket::Run()
{
char RecvBuff[BUFSIZE];
while (1)
{
int RecvLen = recv(Socket, reinterpret_cast<char*>(RecvBuff), BUFSIZE, 0);
if (RecvLen != SOCKET_ERROR)
{
for (int i = 0; i < RecvLen; ++i)
buffer.push(RecvBuff[i]);
}
else
{
buffer.push(2);
buffer.push(SOCKET_ERROR);
return 0;
}
}
return 0;
}
void ClientSocket::Exit()
{
if (Socket)
{
closesocket(Socket);
WSACleanup();
}
}
bool ClientSocket::ConnectServer()
{
WSADATA wsaData;
int nRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (nRet != 0)
{
return false;
}
Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if (Socket == INVALID_SOCKET)
{
return false;
}
SOCKADDR_IN stServerAddr;
stServerAddr.sin_family = AF_INET;
stServerAddr.sin_port = htons(gameInst->Port);
stServerAddr.sin_addr.s_addr = inet_addr(TCHAR_TO_ANSI(ToCStr(gameInst->ipAddr)));
nRet = connect(Socket, (sockaddr*)&stServerAddr, sizeof(sockaddr));
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Trying to connect.")));
if (nRet == SOCKET_ERROR)
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("Fail")));
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, gameInst->ipAddr);
return false;
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("Success!")));
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green,
FString::Printf(TEXT("%i.%i"), wsaData.wVersion >> 8, wsaData.wVersion & 0xFF));
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, gameInst->ipAddr);
UE_LOG(LogNet, Warning, TEXT("Socket Initialized"));
return true;
}
}
bool ClientSocket::Send(const int SendSize, void* SendData)
{
char buff[BUFSIZE];
memcpy(buff, SendData, SendSize);
int nSendLen = send(Socket, buff, buff[0], 0);
UE_LOG(LogNet, Display, TEXT("Send Packet SIZE %d"), nSendLen);
return true;
}