SDL_Net忽略传递的端口值并在随机空闲端口上启动服务器

时间:2014-10-26 17:15:12

标签: c++ sdl sdl-net

我正在尝试在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上启动两个实例时,该游戏的服务器会抱怨占用端口,但我的新程序没有。

1 个答案:

答案 0 :(得分:0)

我弄清楚出了什么问题。

这很奇怪,但看起来像port(uint16_t)需要以反向字节顺序表示。 所以,7777成为24862。

(另外,我对程序选择随机自由端口的假设是错误的,因为我使用7777作为第一个实例,7779作为第二个实例。)