Skip to content

Commit 16611c5

Browse files
committed
dummy udp socket
1 parent ed3178d commit 16611c5

5 files changed

Lines changed: 103 additions & 16 deletions

File tree

lib/libkiwi/support/kiwiLibSO.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -473,17 +473,17 @@ s32 LibSO::RecvImpl(SOSocket socket, void* dst, u32 len, u32 flags,
473473

474474
// Output vector 2: Source address
475475
IosObject<SockAddrAny> from;
476-
IosVector dummy;
477-
if (addr != nullptr) {
478-
*from = *addr;
479-
output.PushBack(from);
480-
} else {
481-
output.PushBack(dummy);
482-
}
476+
output.PushBack(from);
483477

484478
s32 result = sDevNetIpTop.IoctlV(Ioctl_SORecvFrom, input, output);
485479
sLastError = result >= 0 ? SO_SUCCESS : static_cast<SOResult>(result);
486480

481+
if (sLastError == SO_SUCCESS) {
482+
if (addr != NULL) {
483+
*addr = *from;
484+
}
485+
}
486+
487487
return result;
488488
}
489489

src/core/EchoSocket.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include "core/EchoSocket.h"
2+
3+
#include <libkiwi.h>
4+
5+
K_DYNAMIC_SINGLETON_IMPL(AP::EchoSocket);
6+
7+
namespace AP {
8+
9+
EchoSocket::EchoSocket() {
10+
bool success;
11+
12+
mpSocket = new kiwi::SyncSocket( //
13+
SO_PF_INET, /* ipv4 */
14+
SO_SOCK_DGRAM /* udp = datagram*/
15+
);
16+
17+
ASSERT_PTR(mpSocket);
18+
mpSocket->SetBlocking(false);
19+
20+
// Packet data buffer
21+
mpDataBuffer = new (kiwi::EMemory_MEM2) u8[MAX_PACKET_SIZE];
22+
ASSERT_PTR(mpDataBuffer);
23+
24+
// Bind to any available local address
25+
kiwi::SockAddr4 addr(kiwi::port::AP_COMM);
26+
success = mpSocket->Bind(addr);
27+
ASSERT_EX(success, "Can't bind socket");
28+
29+
// Host address now has the correct IP
30+
u16 port = addr.port;
31+
mpSocket->GetHostAddr(addr);
32+
addr.port = port;
33+
34+
kiwi::cout << "Echo socket listening on: " << kiwi::ToString(addr)
35+
<< kiwi::endl;
36+
37+
for (;;) {
38+
// Receive packet from the peer
39+
kiwi::Optional<u32> nrecv =
40+
mpSocket->RecvBytesFrom(mpDataBuffer, MAX_PACKET_SIZE, mPeerAddr);
41+
42+
if (!nrecv) {
43+
ASSERT_EX(false, "Socket error (errcode %d)",
44+
kiwi::LibSO::GetLastError());
45+
}
46+
47+
if (*nrecv > 0) {
48+
kiwi::cout << "Received data from " << kiwi::ToString(mPeerAddr)
49+
<< "(" << *nrecv << " bytes)" << kiwi::endl;
50+
51+
mpSocket->SendBytesTo(mpDataBuffer, *nrecv, mPeerAddr);
52+
}
53+
}
54+
}
55+
56+
} // namespace AP

src/core/EchoSocket.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef APCLIENT_CORE_ECHO_SOCKET_H
2+
#define APCLIENT_CORE_ECHO_SOCKET_H
3+
#include <types.h>
4+
5+
#include <libkiwi.h>
6+
7+
namespace AP {
8+
9+
class EchoSocket : public kiwi::DynamicSingleton<EchoSocket> {
10+
friend class kiwi::DynamicSingleton<EchoSocket>;
11+
12+
private:
13+
static const u32 MAX_PACKET_SIZE = 256;
14+
15+
private:
16+
static void SocketCallbackFunc(SOResult result, void* pArg);
17+
18+
EchoSocket();
19+
20+
private:
21+
kiwi::SyncSocket* mpSocket;
22+
u8* mpDataBuffer;
23+
kiwi::SockAddr4 mPeerAddr;
24+
};
25+
26+
} // namespace AP
27+
28+
#endif

src/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "core/CheckMgr.h"
22
#include "core/CosmeticMgr.h"
3+
#include "core/EchoSocket.h"
34
#include "core/ItemMgr.h"
45
#include "core/const.h"
56
#include <Pack/RPSystem.h>
@@ -42,6 +43,8 @@ void KokeshiMain() {
4243
// Enter first scene
4344
kiwi::SceneCreator::GetInstance().ChangeBootScene();
4445

46+
AP::EchoSocket::CreateInstance();
47+
4548
// Enter game loop
4649
RP_GET_INSTANCE(RPSysSystem)->mainLoop();
4750

src/scene/DebugRootScene/SeqSelectPage.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace {
1212
// clang-format off
1313

1414
// List of all scenes/sequences/stages
15-
#define USE_GAME_DATA() \
15+
#define USE_GAME_DATA \
1616
X(Swf, \
1717
Y(Swf_Vs, Z(Main)) \
1818
Y(Swf_Prc, Z(Main)) \
@@ -60,22 +60,22 @@ namespace {
6060
// Generate gamemode keys
6161
#define X(S, QT) namespace S { const char* GAMEMODE_KEYS[] = { QT }; }
6262
#define Y(Q, T) #Q,
63-
USE_GAME_DATA();
63+
USE_GAME_DATA;
6464
#undef X
6565
#undef Y
6666

6767
// Generate gamemode values
6868
#define X(S, QT) namespace S { const Sp2::Cmn::ESeq GAMEMODE_VALUES[] = { QT }; }
6969
#define Y(Q, T) Sp2::Cmn::ESeq_##Q,
70-
USE_GAME_DATA();
70+
USE_GAME_DATA;
7171
#undef X
7272
#undef Y
7373

7474
// Generate stage keys
7575
#define X(S, QT) QT
7676
#define Y(Q, T) namespace Q { const char* STAGENO_KEYS[] = { T }; }
7777
#define Z(T) #T,
78-
USE_GAME_DATA();
78+
USE_GAME_DATA;
7979
#undef X
8080
#undef Y
8181
#undef Z
@@ -84,7 +84,7 @@ USE_GAME_DATA();
8484
#define X(S, QT) QT
8585
#define Y(Q, T) namespace Q { enum STAGENO_ENUM { T }; const u32 STAGENO_VALUES[] = { T }; }
8686
#define Z(T) T,
87-
USE_GAME_DATA();
87+
USE_GAME_DATA;
8888
#undef X
8989
#undef Y
9090
#undef Z
@@ -221,7 +221,7 @@ void SeqSelectPage::CalcOption() {
221221
break; \
222222
}
223223

224-
switch (mNextScene) { USE_GAME_DATA(); }
224+
switch (mNextScene) { USE_GAME_DATA; }
225225
#undef X
226226

227227
// Setup StageNo option by the selected sequence
@@ -239,7 +239,7 @@ void SeqSelectPage::CalcOption() {
239239
break; \
240240
}
241241

242-
switch (mNextScene) { USE_GAME_DATA(); }
242+
switch (mNextScene) { USE_GAME_DATA; }
243243
#undef X
244244
#undef Y
245245
}
@@ -259,7 +259,7 @@ void SeqSelectPage::SetupGame() {
259259
seq = S::GAMEMODE_VALUES[mGameMode.GetValue()]; \
260260
break; \
261261
}
262-
switch (mNextScene) { USE_GAME_DATA(); }
262+
switch (mNextScene) { USE_GAME_DATA; }
263263
#undef X
264264
#undef Y
265265

@@ -276,7 +276,7 @@ void SeqSelectPage::SetupGame() {
276276
break; \
277277
}
278278

279-
switch (mNextScene) { USE_GAME_DATA(); }
279+
switch (mNextScene) { USE_GAME_DATA; }
280280
#undef X
281281
#undef Y
282282

0 commit comments

Comments
 (0)