SDL_Net игнорирует переданное значение порта и запускает сервер на случайном свободном порте

Я пытаюсь написать что-то вроде небольшого прокси на SDL & SDL_Net.

Моя программа успешно создает сервер и ожидает входящего соединения.
Но по какой-то причине он игнорирует введенный порт и всегда использует 24862. Если я запускаю другой экземпляр, он выбирает другой случайный свободный порт.

Это мой код:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <csignal>
#include <string>
#include "SDL2/SDL.h"#include "SDL2/SDL_net.h"
void Error(const char *txt)
{
std::cout << txt;

static volatile int v = 0;
while (1)
v++;
}

int main(int, char **)
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_NOPARACHUTE))
Error("SDL init failed!");
if (SDLNet_Init())
Error("SDL net plugin init failed!");
TCPsocket srv1, srv2, con;
IPaddress con_ip, host_ip;
{
{
auto handler = [](int){std::exit(0);};
std::signal(SIGFPE, handler);
std::signal(SIGILL, handler);
std::signal(SIGINT, handler);
std::signal(SIGBREAK, handler);
std::signal(SIGSEGV, handler);
std::signal(SIGTERM, handler);
std::signal(SIGABRT, handler);
}

std::cout << "  < Wellcome to Retranslator! >\n\nWhat is your hosting port?\n>: ";
int hport = 0, cport = 0;
char c;

while (c = std::getchar(), c != '\n')
hport = hport * 10 + (c - '0');
std::cout << "[" << hport << "]\n";

std::cout << "What ip you want to connect to?\n>: ";
std::string ips;
while (c = std::getchar(), c != '\n')
ips += c;
std::cout << "[" << ips << "]\n";

std::cout << "What port you want to connect to?\n>: ";
while (c = std::getchar(), c != '\n')
cport = cport * 10 + (c - '0');
std::cout << "[" << cport << "]\n";

host_ip.host = INADDR_ANY;
host_ip.port = hport;

SDLNet_ResolveHost(&con_ip, ips.c_str(), cport);

if (con_ip.host == INADDR_NONE)
Error("IP parsing failed!");

srv1 = SDLNet_TCP_Open(&host_ip);
if (srv1 == 0)
Error("Server creation failed!");

std::cout << "Server created on port " << hport << "!\nWaiting for incoming connection...\n";

while (1)
{
srv2 = SDLNet_TCP_Accept(srv1);
if (srv2)
break;
}
std::cout << "Remote client joined!\n";
con = SDLNet_TCP_Open(&con_ip);
if (con == 0)
Error("Can't connect to application!");
std::cout << "Successfully connected to application!\n";
}
return 0;
}

Я был удивлен, потому что я уже написал игру, которая использовала SDL_Net. Я проверил порт сервера этой игры с TCPview — он тоже 24862 (он должен быть 7777)! Кроме того, клиент игры успешно подключается к нему (и он также должен подключиться к 7777)!

Кроме того, сервер этой игры жалуется на занятый порт, когда я пытаюсь запустить два экземпляра на 7777, но моя новая программа этого не делает.

0

Решение

Я понял, что случилось.

Это странно, но похоже, что порт (uint16_t) должен быть представлен в обратном порядке байтов.
Итак, 7777 стало 24862.

(Кроме того, мое предположение о программном выборе случайного свободного порта было неверным, потому что я использовал 7777 для первого экземпляра и 7779 для второго.)

0

Другие решения


По вопросам рекламы [email protected]