SFML и C++ Уроки \ Разработка игр › Форумы › SFML Network › Отключение клиента от сервера + разные вопросы
В этой теме 2 ответа, 2 участника, последнее обновление KindRedSand 5 года/лет, 10 мес. назад.
-
АвторСообщения
-
Пишу клиент-серверное приложение на SFML Network вроде все работает, данные отправляются и получаются. Сервер может работать с несколькими клиентами.
Код сервера.C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950void runTcpServer(unsigned short port){sf::TcpListener listener;listener.listen(port);std::list<sf::TcpSocket*> clients;sf::SocketSelector selector;selector.add(listener);while (true){if (selector.wait()){if (selector.isReady(listener)){sf::TcpSocket* client = new sf::TcpSocket;if (listener.accept(*client) == sf::Socket::Done){std::cout << "listener.accept\n";clients.push_back(client);selector.add(*client);}else {delete client;}}else{for (auto it = clients.begin(); it != clients.end(); ++it){sf::TcpSocket& client = **it;if (selector.isReady(client)){size_t received;byte buf[256];if (client.receive(buf, sizeof(buf), received) == sf::Socket::Done){BitStream bs(buf, sizeof(buf), false);int val1; bs.Read(val1);float val2; bs.Read(val2);std::cout << "Receive: " << val1 << " "<< val2 << std::endl;}}}}} // selector wait} // while}Код клиента.
C++123456789101112131415161718192021222324252627282930void runTcpClient(unsigned short port){// Ask for the server addresssf::IpAddress server;do{std::cout << "Type the address or name of the server to connect to: ";std::cin >> server;}while (server == sf::IpAddress::None);// Create a socket for communicating with the serversf::TcpSocket socket;// Connect to the serverif (socket.connect(server, port) != sf::Socket::Done)return;std::cout << "Connected to server " << server << std::endl;// Send messageBitStream bs;bs.Write(1337);bs.Write(76.765f);if (socket.send(bs.GetData(), bs.GetNumberOfBytesUsed()) != sf::Socket::Done)return;socket.disconnect();std::cout << "sended\n";}Но как реализовать проверку на сервере на то что один из клиентов отключился?
P.S А на BitStream можете не обращать внимания это какой-то класс, откуда то я его взял, это как-бы контейнер для хранения байтов
Для начала в SFML Network уже присутствует контейнер для получаемых данных Packet. Instance of TYPE текущего масива в пакете проверяется легко
C++12345678910111213141516sf::Packet packet;std::String s;socket.recieve(packet);while (!packet.endOfPacket())if (packet >> s){//Значит пакет является строкой}//И отправлять пакет прощеstd::string s = "Hello world!";sf::Pakcet packet;packet << s;socket.send(packet);Ну и у тебя есть 2 выбора. Либо при дисконекте клиента отправлять на сервер кодовую строку, либо проверять state у sf::Socket
C++123456789//Если было socket.disconnect()if (socket.send(packet) == sf::Socket::Disconnected);if (socket.receive(packet) == sf::Socket::Disconnected);//Если подключения вовсе небылоif (socket.send(packet) == sf::Socket::NotReady);if (socket.receive(packet) == sf::Socket::NotReady);//Если при отправке/приёме данных произошла ошибкаif (socket.send(packet) == sf::Socket::Error);if (socket.receive(packet) == sf::Socket::Error);А, и не забывай использовать где надо packet.clear();
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.