我计划通过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;
}
答案 0 :(得分:0)
您的问题只是您在socket.connect(ip, 2000);
中设置了错误的目标IP。
如果您使用sf::IpAddress::getLocalAddress()
,您将获得运行该程序的当前计算机的IP。
如果您正在使用sf::IpAddress::getPublicAddress()
,您将获得您的LAN暴露于互联网的IP(通常是您的路由器的WAN IP)。为此,它需要正确的端口转发,但也可能阻止从LAN端连接的客户端(安全功能,以防止本地恶意软件伪造互联网域)。
作为解决方案,将ip
设置为运行服务器的计算机的IP地址。它应该连接。