在多台计算机上运行SFML tcp网络程序

时间:2018-03-12 05:14:42

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

我计划通过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;
}

1 个答案:

答案 0 :(得分:0)

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

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

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

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