c++ - SFML 网络服务器/客户端

标签 c++ sockets networking client-server sfml

我刚刚开始学习 SFML 网络...我正在制作一个服务器客户端聊天框...当我在 PC 上运行客户端程序时,它会连接到也在我的 PC 上运行的服务器.....但是问题是我的笔记本电脑上的客户端程序无法连接到我的 PC 上的服务器程序......这是服务器的代码:

void main()
{
cout << "Server Running" << endl;
TcpListener listener;
SocketSelector selector;
bool done = false;
vector<TcpSocket*>clients;
listener.getLocalPort();
listener.listen(2000);
selector.add(listener);

while (!done)
{
    if (selector.wait())
    {
        if (selector.isReady(listener))
        {
            TcpSocket *socket = new TcpSocket;

            listener.accept(*socket);
            Packet packet;
            string id;
            string status;
            if (socket->receive(packet) == Socket::Done)
                packet >> id>>status;
            cout << id << " has "<<status;
            clients.push_back(socket);
            selector.add(*socket);
        }
        else
        {
            for (int i = 0;i < clients.size();i++)
            {
                if (selector.isReady(*clients[i]))
                {
                    Packet packet, sendpacket;
                    if (clients[i]->receive(packet) == Socket::Done)
                    {
                        string text;
                        packet >> text;
                        sendpacket << text;
                        for (int j = 0;j < clients.size();j++)
                        {
                            if (i != j)
                            {
                                clients[j]->send(sendpacket);
                            }
                        }
                    }
                }
            }
        }
    }
}

for (vector<TcpSocket*>::iterator it = clients.begin();it != clients.end();it++)
    delete *it;
}

客户端代码:

#include<SFML/Network.hpp>
#include<SFML/Graphics.hpp>
#include<iostream>
#include<string>
#include<vector>
#include<conio.h>

using namespace sf;
using namespace std;

void main()
{
IpAddress ip = IpAddress::getLocalAddress();
cout << ip << endl;

TcpSocket socket;
bool done = false;

string id;
string status = "connected";
string text = "";

cout << "Enter online id: ";
cin >> id;

socket.connect(ip, 2000);

Packet packet;

packet << id<< status;
socket.send(packet);
socket.setBlocking(false);

RenderWindow window(VideoMode(800, 600, 32), id);
vector<Text> chat;

Font font;
font.loadFromFile("Data/font.ttf");

while (window.isOpen())
{
    Event event;
    while (window.pollEvent(event))
    {
        switch (event.type)
        {
        case Event::Closed:
            window.close();
            break;
        case Event::KeyPressed:
            if (event.key.code == Keyboard::Escape)
            {
                text.clear();
            }               
            else if (event.key.code == Keyboard::Return)
            {
                Packet packet;
                packet << id + ":" + text;
                socket.send(packet);
                Text displaytext(text, font, 20);
                displaytext.setColor(Color::Green);
                chat.push_back(displaytext);
                text = "";
            }
            break;
        case Event::TextEntered:
            if (event.text.unicode == '\b' && text.size() >0)
            {
                text.erase(text.size() - 1, 1);
            }
            else
            text += event.text.unicode;
            break;
        }
    }

    Packet packet;
    socket.receive(packet);
    string temptext;
    if (packet >> temptext)
    {
        Text displaytext(temptext, font, 20);
        displaytext.setColor(Color::Blue);
        chat.push_back(displaytext);
    }
    int i = 0;
    for (i;i<chat.size();i++)
    {
        chat[i].setPosition(0, i * 20);
        window.draw(chat[i]);
    }

    Text drawtext(text, font, 20);
    drawtext.setColor(Color::Red);
    drawtext.setPosition(0, i * 20);
    window.draw(drawtext);

    window.display();
    window.clear();
}

}

我需要知道我的笔记本电脑客户端如何找到并连接到服务器(PC)?

最佳答案

您需要获取服务器的 IP 地址。现在,您将客户端 IP 地址提供给客户端,这是行不通的。

对于初学者,您可以查找它并对其进行硬编码,但从长远来看,您需要找到一种方法使其更加动态。

最后一件事:不存在 void main() 这样的东西。这是未定义的行为,摆脱它。使用有效的入口点,您很可能想使用 int main()

关于c++ - SFML 网络服务器/客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37256286/

相关文章:

java - 正确关闭 SSLSocket

c - tcp(内核)旁路是如何实现的?

java - 使用 DatagramChannel 加入多播组而不指定网络接口(interface)

c++ - 为什么我可以通过在 C++ 中分配整型常量来初始化 Test 类的对象?

c++ - STL列表中结构的自动初始化

c++ - 简单的 FTP 客户端 C++

python - Twitch IRC 机器人不发送消息

linux - 无法 ping 通 vmware 中的默认网关 linux

c++ - 如何引用多维指针?

c++ - 防止 clang-format 在 -> 运算符处换行