我正在尝试在SDL和SD上写一个类似小代理的东西。 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 :(得分:0)
我弄清楚出了什么问题。
这很奇怪,但看起来像port(uint16_t)需要以反向字节顺序表示。 所以,7777成为24862。
(另外,我对程序选择随机自由端口的假设是错误的,因为我使用7777作为第一个实例,7779作为第二个实例。)