SFML и C++ Уроки \ Разработка игр › Форумы › SFML Network › TCP более одного подключения
В этой теме 1 ответ, 1 участник, последнее обновление mypmyp 8 года/лет, 6 мес. назад.
-
АвторСообщения
-
Всем доброго времени суток, друзья.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130#include <SFML/Graphics.hpp>#include <SFML/Network.hpp>#include <SFML/Graphics/Text.hpp>#include <iostream>#include <list>#include <string>using namespace std;using namespace sf;int main() {setlocale(LC_ALL, ""); // Поддержка кириллицы в консоли WindowsIpAddress ip = IpAddress::getLocalAddress(); //Локальный ip Адресс//TcpSocket socket;//программный интерфейс для обеспечения обмена данными между процессамиPacket packet; //Для осуществления пакетной передачи дынныхchar type;int x = 0; //координаты шараint y = 0;char buffer[2000];size_t received; //??string text = "connected";cout << "version 1.0" << endl;cout << ip << endl;//listener.accept(socket); //который будет содержать новое соединение//socket.setBlocking(false);// Create a socket to listen to new connectionssf::TcpListener listener;listener.listen(2000);// Create a list to store the future clientsstd::list<sf::TcpSocket*> clients;// Create a selectorsf::SocketSelector selector;// Add the listener to the selectorselector.add(listener);// Endless loop that waits for new connectionswhile (true){cout << "go to while";// Make the selector wait for data on any socketif (selector.wait()){cout << "1";// Test the listenerif (selector.isReady(listener)){cout << "2";// The listener is ready: there is a pending connectionsf::TcpSocket* client = new sf::TcpSocket;if (listener.accept(*client) == sf::Socket::Done){cout << "3";// Add the new client to the clients listclients.push_back(client);// Add the new client to the selector so that we will// be notified when he sends somethingselector.add(*client);}else{cout << "4";// Error, we won't get a new connection, delete the socketdelete client;}}else{cout << "5";// The listener socket is not ready, test all other sockets (the clients)for (std::list<sf::TcpSocket*>::iterator it = clients.begin(); it != clients.end(); ++it){sf::TcpSocket& client = **it;if (selector.isReady(client)){cout << "6";// The client has sent some data, we can receive itclient.receive(packet);cout << "7";//Команда которая ожидает данных в виде пакета от клиентской частиif (packet >> text){cout << "8";//вытаскиваем значение из пакета в переменную x и у (действие уже происходит)cout << "Client: " << text << endl; //..и если все прошло успешно то выводим её координаты}packet << text; //Пакуем значения координат в Пакетclient.send(packet); //Отправка данныхpacket.clear(); //Чистим пакетif (client.receive(packet) == sf::Socket::Done){cout << "9";}}}}}}/* socket.send(text.c_str(), text.length() + 1);socket.receive(buffer, sizeof(buffer), received);cout << buffer << endl;while (true){socket.receive(packet); //Команда которая ожидает данных в виде пакета от клиентской частиif (packet >> text){ //вытаскиваем значение из пакета в переменную x и у (действие уже происходит)cout << "Client: " << text << endl; //..и если все прошло успешно то выводим её координаты}packet << text; //Пакуем значения координат в Пакетsocket.send(packet); //Отправка данныхpacket.clear(); //Чистим пакетsleep(sf::milliseconds(10));//Задержка}*/system("pause");return 0;Вот код сервера. Много дней и ночей потрачено что бы добиться правильной работы. Но все в пустую… Загвоздка в том что может подключится только 1 клиент. И все, сервер работает только с ним. Если кто из вас знает подскажите куда копать то?
Может что почитать, только пожалуйста конкретно по данной проблеме, ну или часть вашего кода не помешает)
Буду очень благодарен p.s. Пользоваться гуглом умею и продолжаю поиски.э
Огромное спасибо Fedor.
Код много раз редактировался. Прошу на многие нелепости не обращать внимание.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.