4
4
#include " utils/net.h"
5
5
#include " utils/utils.h"
6
6
#include < algorithm>
7
+ #include < coreinit/cache.h>
7
8
#include < coreinit/debug.h>
8
9
#include < coreinit/dynload.h>
9
10
#include < coreinit/title.h>
10
11
#include < cstring>
11
12
#include < rpxloader/rpxloader.h>
12
13
#include < sysapp/launch.h>
13
- #include < sysapp/title.h>
14
14
#include < vector>
15
15
#include < wups_backend/PluginUtils.h>
16
16
#include < zlib.h>
@@ -30,18 +30,16 @@ TcpReceiver::TcpReceiver(int32_t port)
30
30
31
31
TcpReceiver::~TcpReceiver () {
32
32
exitRequested = true ;
33
-
33
+ OSMemoryBarrier ();
34
34
if (serverSocket >= 0 ) {
35
- shutdown (serverSocket, SHUT_RDWR);
36
- close (serverSocket);
37
- serverSocket = -1 ;
35
+ cleanupSocket ();
38
36
}
39
37
}
40
38
41
- void TcpReceiver::executeThread () {
39
+ bool TcpReceiver::createSocket () {
42
40
serverSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_IP);
43
41
if (serverSocket < 0 ) {
44
- return ;
42
+ return false ;
45
43
}
46
44
47
45
uint32_t enable = 1 ;
@@ -53,48 +51,62 @@ void TcpReceiver::executeThread() {
53
51
bindAddress.sin_port = serverPort;
54
52
bindAddress.sin_addr .s_addr = INADDR_ANY;
55
53
56
- socklen_t len;
54
+
57
55
int32_t ret;
58
56
if ((ret = bind (serverSocket, (struct sockaddr *) &bindAddress, 16 )) < 0 ) {
59
- shutdown (serverSocket, SHUT_RDWR);
60
- close (serverSocket);
61
- serverSocket = -1 ;
62
- return ;
57
+ cleanupSocket ();
58
+ return false ;
63
59
}
64
60
65
61
if ((ret = listen (serverSocket, 1 )) < 0 ) {
62
+ cleanupSocket ();
63
+ return false ;
64
+ }
65
+ return true ;
66
+ }
67
+
68
+ void TcpReceiver::cleanupSocket () {
69
+ if (serverSocket >= 0 ) {
66
70
shutdown (serverSocket, SHUT_RDWR);
67
71
close (serverSocket);
68
72
serverSocket = -1 ;
69
- return ;
70
73
}
74
+ }
71
75
72
- struct sockaddr_in clientAddr {};
73
- memset (&clientAddr, 0 , sizeof (clientAddr));
74
-
76
+ void TcpReceiver::executeThread () {
77
+ socklen_t len;
75
78
while (!exitRequested) {
76
- len = 16 ;
79
+ if (serverSocket < 0 ) {
80
+ if (!createSocket ()) {
81
+ DEBUG_FUNCTION_LINE_WARN (" Starting the wiiload server failed. Check the network connection." );
82
+ OSSleepTicks (OSSecondsToTicks (5 ));
83
+ }
84
+ continue ;
85
+ }
86
+ struct sockaddr_in clientAddr {};
87
+ memset (&clientAddr, 0 , sizeof (clientAddr));
88
+
89
+ len = 16 ;
90
+ DEBUG_FUNCTION_LINE (" Waiting for wiiload connection" );
77
91
int32_t clientSocket = accept (serverSocket, (struct sockaddr *) &clientAddr, &len);
78
92
if (clientSocket >= 0 ) {
79
93
uint32_t ipAddress = clientAddr.sin_addr .s_addr ;
80
- // serverReceiveStart(this, ipAddress);
81
- int32_t result = loadToMemory (clientSocket, ipAddress);
82
- // serverReceiveFinished(this, ipAddress, result);
94
+ int32_t result = loadToMemory (clientSocket, ipAddress);
83
95
close (clientSocket);
84
96
85
-
86
97
if (result >= 0 ) {
87
98
break ;
88
99
}
89
100
} else {
90
- DEBUG_FUNCTION_LINE_ERR (" Server socket accept failed socket: %i errno: %d" , clientSocket, errno);
91
- OSSleepTicks (OSMicrosecondsToTicks (100000 ));
101
+ if (!exitRequested) {
102
+ DEBUG_FUNCTION_LINE_WARN (" Error accepting the socket" );
103
+ cleanupSocket ();
104
+ OSSleepTicks (OSSecondsToTicks (1 ));
105
+ }
92
106
}
93
107
}
94
-
95
- shutdown (serverSocket, SHUT_RDWR);
96
- close (serverSocket);
97
- serverSocket = -1 ;
108
+ cleanupSocket ();
109
+ DEBUG_FUNCTION_LINE (" Stopping wiiload server." );
98
110
}
99
111
100
112
int32_t TcpReceiver::loadToMemory (int32_t clientSocket, uint32_t ipAddress) {
0 commit comments