Add networking client
This commit is contained in:
parent
9b802afe65
commit
17e6b2ef2b
|
@ -0,0 +1,8 @@
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
stage ("Build Wii") {
|
||||||
|
steps {
|
||||||
|
load "wii/Jenkinsfile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
docker { image 'devkitpro/devkitppc' }
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage('Build') {
|
||||||
|
steps {
|
||||||
|
sh 'make'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Archive') {
|
||||||
|
steps {
|
||||||
|
archiveArtifacts artifacts: 'boot.dol', fingerprint: true
|
||||||
|
archiveArtifacts artifacts: 'meta.xml', fingerprint: true
|
||||||
|
archiveArtifacts artifacts: 'icon.png', fingerprint: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +1,33 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <gccore.h>
|
#include <gccore.h>
|
||||||
#include <wiiuse/wpad.h>
|
#include <wiiuse/wpad.h>
|
||||||
|
|
||||||
|
#include "network/networking.h"
|
||||||
|
#include "network/udp_client.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
|
/// The IP address of the server to connect to.
|
||||||
|
const std::string SERVER_IP_ADDRESS = "192.168.0.1";
|
||||||
|
|
||||||
|
/// The port number of the server to connect to.
|
||||||
|
constexpr uint16_t SERVER_PORT = 10000;
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
// Screen init
|
||||||
auto screen = Screen{};
|
auto screen = Screen{};
|
||||||
|
|
||||||
|
// Controller init
|
||||||
WPAD_Init();
|
WPAD_Init();
|
||||||
|
|
||||||
Paddle my_paddle{ screen.height(), 15, 5 };
|
// Network init
|
||||||
|
Networking network;
|
||||||
|
network.init();
|
||||||
|
auto udp_client = UdpClient{ SERVER_IP_ADDRESS, SERVER_PORT };
|
||||||
|
|
||||||
auto exit = false;
|
auto exit = false;
|
||||||
while (!exit)
|
while (!exit)
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
#include "networking.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
#include <optional>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <gccore.h>
|
||||||
|
#include <network.h>
|
||||||
|
|
||||||
|
|
||||||
|
bool Networking::_connected = false;
|
||||||
|
|
||||||
|
bool Networking::init() noexcept
|
||||||
|
{
|
||||||
|
if (!Networking::_connected)
|
||||||
|
{
|
||||||
|
int32_t ret = if_config(
|
||||||
|
_ip_address,
|
||||||
|
_netmask,
|
||||||
|
_gateway,
|
||||||
|
TRUE,
|
||||||
|
20
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ret >= 0)
|
||||||
|
Networking::_connected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Networking::_connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t Networking::create_socket(uint8_t type)
|
||||||
|
{
|
||||||
|
if (type != SOCK_STREAM && type != SOCK_DGRAM)
|
||||||
|
throw std::invalid_argument("Unsupported socket type.");
|
||||||
|
|
||||||
|
int32_t sock = net_socket(AF_INET, type, IPPROTO_IP);
|
||||||
|
if (sock == INVALID_SOCKET)
|
||||||
|
throw std::runtime_error("Could not create socket.");
|
||||||
|
|
||||||
|
return sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<sockaddr_in> Networking::create_host(uint16_t port) noexcept
|
||||||
|
{
|
||||||
|
auto server = std::make_unique<sockaddr_in>();
|
||||||
|
server->sin_family = AF_INET;
|
||||||
|
server->sin_port = htons(port);
|
||||||
|
server->sin_addr.s_addr = INADDR_ANY;
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<sockaddr_in> Networking::create_dest(std::string_view ip_address, uint16_t port) noexcept
|
||||||
|
{
|
||||||
|
auto server = std::make_unique<sockaddr_in>();
|
||||||
|
server->sin_family = AF_INET;
|
||||||
|
server->sin_port = htons(port);
|
||||||
|
inet_aton(ip_address.data(), &(server->sin_addr));
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> Networking::get_ip_address() noexcept
|
||||||
|
{
|
||||||
|
return Networking::_connected ? std::optional(std::string(_ip_address)) : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> Networking::get_netmask() noexcept
|
||||||
|
{
|
||||||
|
return Networking::_connected ? std::optional(std::string(_netmask)) : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> Networking::get_gateway() noexcept
|
||||||
|
{
|
||||||
|
return Networking::_connected ? std::optional(std::string(_gateway)) : std::nullopt;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <network.h>
|
||||||
|
|
||||||
|
|
||||||
|
class Networking final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool init() noexcept;
|
||||||
|
static int32_t create_socket(uint8_t type);
|
||||||
|
static std::unique_ptr<sockaddr_in> create_host(uint16_t port) noexcept;
|
||||||
|
static std::unique_ptr<sockaddr_in> create_dest(std::string_view ip_address, uint16_t port) noexcept;
|
||||||
|
std::optional<std::string> get_ip_address() noexcept;
|
||||||
|
std::optional<std::string> get_netmask() noexcept;
|
||||||
|
std::optional<std::string> get_gateway() noexcept;
|
||||||
|
private:
|
||||||
|
static bool _connected;
|
||||||
|
char _ip_address[16];
|
||||||
|
char _netmask[16];
|
||||||
|
char _gateway[16];
|
||||||
|
};
|
|
@ -0,0 +1,26 @@
|
||||||
|
#include "udp_client.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <network.h>
|
||||||
|
|
||||||
|
#include "networking.h"
|
||||||
|
|
||||||
|
|
||||||
|
UdpClient::UdpClient(std::string_view ip_address, uint16_t port):
|
||||||
|
_sock { Networking::create_socket(SOCK_DGRAM) },
|
||||||
|
_client { Networking::create_host(0) },
|
||||||
|
_server { Networking::create_dest(ip_address, port) }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UdpClient::send()
|
||||||
|
{
|
||||||
|
net_sendto(_sock, "Ping!", sizeof("Ping!"), 0, (sockaddr *)(_server.get()), sizeof(sockaddr_in));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string UdpClient::receive()
|
||||||
|
{
|
||||||
|
char buffer[1500] = {};
|
||||||
|
net_recv(_sock, &buffer[0], 1500, 0);
|
||||||
|
return std::string(buffer);
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <network.h>
|
||||||
|
|
||||||
|
|
||||||
|
class UdpClient final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UdpClient(std::string_view ip_address, uint16_t port);
|
||||||
|
void send();
|
||||||
|
std::string receive();
|
||||||
|
private:
|
||||||
|
int32_t _sock;
|
||||||
|
std::unique_ptr<sockaddr_in> _client;
|
||||||
|
std::unique_ptr<sockaddr_in> _server;
|
||||||
|
};
|
Loading…
Reference in New Issue