sfml 联网,SocketSelector 成员函数 isReady 不能正常工作

Sfml networking, SocketSelector member function isReady not working correctly

我正在编写基于 sfml 网络库和 tcp 套接字的简单网络系统。 当我编译 运行 我的程序时,我在屏幕上得到了输出(截图)。

看起来 selector.wait() (Server.cpp:20) 没有在等待任何数据包,并且 selector.isReady(TCPSOCKET) (Server.cpp:43) 没有正确检查客户端是否正在向服务器发送数据包。

代码: main.cpp

#include <iostream>
#include "Server.h"

int main()
{
    int mode = 0;
    std::cin >> mode;
    if(mode == 0)
    {
        Server server(55200);
    }else if(mode == 1){

        sf::TcpSocket socket;

        if (socket.connect("localhost", 55200) != sf::Socket::Done)
        {
            std::cout << "Error1\n";
        }
        //Sleep(2000);
        sf::Packet packet;
        packet << 11;
        if (socket.send(packet) != sf::Socket::Done)
        {
            std::cout << "Error2\n";
        }


    }
    std::cin.get();
    std::cin.get();
}

Server.h

#pragma once
#include <SFML/Network.hpp>
#include <vector>
class Server
{
private:
    sf::TcpListener listener;
    std::vector<sf::TcpSocket*> clients;
    sf::SocketSelector selector;
    unsigned short port;
public:
    Server(unsigned short port);
    ~Server();
};

Server.cpp

#include "Server.h"
#include <iostream>
#include <SFML/Network.hpp>
#include <vector>

Server::Server(unsigned short pport)
{
    port = pport;
    std::cout << "Starting Server....\n";
    if (listener.listen(port) != sf::Socket::Done)
    {
        std::cout << "Failed while starting listening on port: " << port << std::endl;
        return;
    }

    selector.add(listener);

    while(true)
    {
        if (selector.wait())
        {

            //new connection
            if (selector.isReady(listener))
            {
                std::cout << "New connection!!\n";
                sf::TcpSocket* tmp = new sf::TcpSocket; // !!!!!!!!!!!
                if (listener.accept(*tmp) != sf::Socket::Done)
                {
                    std::cout << "Error while accepting new connection\n";
                    delete tmp;
                }
                else {
                    selector.add(*tmp);
                    clients.push_back(tmp);
                }
            }
            else {

                for (int i = 0; i < clients.size(); i++)
                {
                    //new incoming packet
                    if(selector.isReady(*(clients[i])))
                    {
                        sf::Packet pakiet;
                        if (clients[i]->receive(pakiet) != sf::Socket::Done)
                        {
                            std::cout << "Error while receiving packet\n";
                        }
                        else {
                            int x;
                            pakiet >> x;
                            std::cout << "Recived new data!!!: " << x << std::endl;
                        }
                    }
                }
            }
        }
    }
}

Server::~Server()
{
    for (int i = 0; i < clients.size();i++)
    {
        delete clients[i];
    }
}

您创建了一个连接到服务器的客户端,发送了一个包,但在范围结束时被销毁了。客户端的套接字不存在,客户端与服务器之间的连接已关闭。那么,你想如何获取服务端关闭连接的信息呢?

Function isReady returns true,然后你为这个套接字调用 receive 并且作为输出你得到 Status 代码之一:完成,未就绪,断开连接,错误。您需要检查状态是否为已断开连接,如果是,则应从选择器中删除客户端套接字。

  if(selector.isReady(*(clients[i])))
  {
      sf::Packet pakiet;
      if ( clients[i]->receive(pakiet) == sf::Socket::Done)
      {
          // process data
      }
      else if ( clients[i]->receive(pakiet) == sf::Socket::Disconnected ) {
           // delete socket, remove from selector
      }
      else {
         // 
      }
  }