【问题标题】:Run SFML tcp Network program on multiple computers在多台计算机上运行 SFML tcp Network 程序
【发布时间】:2018-03-12 05:14:41
【问题描述】:

我正计划用 SFML 制作一个 TCP-networking 2 人游戏,所以我已经看过这个 Youtube 视频。 ->enter link description here。在那段视频之后,我实际上制作了那个程序,它在我的笔记本电脑上运行良好。但是当我在多台计算机上运行它时,它没有。在那个视频中,他说如果我将 IP 地址::getLocalAdress 设置为 ipAdress::getPublicAdress,我可以在另一台计算机上运行它。我试过了,但还是一样。 有人会检查我的代码吗?

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <SFML/Network.hpp>
#include <string>
#include <iostream>
using namespace std;

int main() {
sf::IpAddress ip = sf::IpAddress::getLocalAddress();
sf::TcpSocket socket;
char connectionType;

std::cout << "Enter (s) for sever, Enter (c) for client" << std::endl;
cin >> connectionType;

if (connectionType == 's') { 
    sf::TcpListener listener;
    listener.listen(2000);
    listener.accept(socket);
}
else
    socket.connect(ip, 2000);

sf::RectangleShape rect1, rect2;
rect1.setSize(sf::Vector2f(20, 20));
rect2.setSize(sf::Vector2f(20, 20));

rect1.setFillColor(sf::Color::Red);
rect2.setFillColor(sf::Color::Blue);

sf::RenderWindow app(sf::VideoMode(800,600,32),"SFML_ProjectBase", sf::Style::Resize);
sf::Vector2f prevPosition, p2Position;

socket.setBlocking(false);

bool update = false;

while (app.isOpen()) {
    sf::Event e;
    while (app.pollEvent(e)) {
        if (e.type == sf::Event::Closed || (e.type == sf::Event::KeyReleased && e.key.code == sf::Keyboard::Escape)) {
            app.close();
        }
        else if (e.type == sf::Event::GainedFocus) {
            update = true;
        }
        else if (e.type == sf::Event::LostFocus) {
            update = false;
        }
    }
    prevPosition = rect1.getPosition();

    if (update) {
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) 
            rect1.move(0.2f, 0.0f);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) 
            rect1.move(-0.2f, 0.0f);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) 
            rect1.move(0.0f, -0.2);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) 
            rect1.move(0.0f, 0.2f);
    }

    sf::Packet packet;

    if (prevPosition != rect1.getPosition()) {
        packet << rect1.getPosition().x << rect1.getPosition().y;
        socket.send(packet);
    }
    socket.receive(packet);
    if (packet >> p2Position.x >> p2Position.y) {
        rect2.setPosition(p2Position);
    }
    app.draw(rect1); 
    app.draw(rect2);

    app.display();
    app.clear();
}
system("pause");
return 0;
}

【问题讨论】:

  • 您应该包括具体问题是什么以及您期望什么。只是倾倒一大堆代码并说“为什么这不起作用?”对于 SO 来说不是一个合适的问题。您是否尝试确定您的代码失败的地方?

标签: c++ networking tcp network-programming sfml


【解决方案1】:

您的问题只是您在socket.connect(ip, 2000); 中设置了错误的目标IP。

  • 如果您使用sf::IpAddress::getLocalAddress(),您将获得当前运行程序的机器的IP。

  • 如果您使用sf::IpAddress::getPublicAddress(),您将获得您的 LAN 向 Internet 公开的 IP(通常是您的路由器的 WAN IP)。为此,它需要适当的端口转发,但也可能会阻止从 LAN 端连接的客户端(防止本地恶意软件伪造互联网域的安全功能)。

作为一种解决方案,将ip 设置为运行服务器的机器的IP 地址。然后它应该连接。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多