SFML и C++ Уроки \ Разработка игр › Форумы › SFML Network › Ряд вопросов › Ответ в теме: Ряд вопросов
Ну вот смотри) Надеюсь тебе что нибудь да и поможет. КОД НЕ ДОРАБОТАН.
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
#include <SFML/Graphics.hpp> #include <SFML/Network.hpp> #include <SFML/Graphics/Text.hpp> #include <SFML/System/String.hpp> #include <SFML/System/Time.hpp> #include <SFML/Network/IpAddress.hpp> #include <iostream> #include <list> #include <string> using namespace std; using namespace sf; struct List { IpAddress ip; //список ип адресов int port; // список портов IpAddress isip; //ип адрес на проверку int isport; // ... Packet packet; List *Next, *Head; }; void Add(IpAddress ip, int port, List *&MyList) { List *temp = new List; temp->ip = ip; temp->port = port; temp->Next = MyList->Head; MyList->Head = temp; } void Send(List *MyList, IpAddress isip, int isport, Packet packet) { UdpSocket socket; // Функция которая отправляет Пакеты всем кроме отправителя List *temp = MyList->Head; while (temp != NULL) { if (temp->ip != isip || temp->port != isport) { socket.send(packet, temp->ip, temp->port); packet.clear(); } temp = temp->Next; } } void Show(List *MyList) { List *temp = MyList->Head; while (temp != NULL) { cout << temp->ip << ":" << temp->port << endl; temp = temp->Next; } } void Proof(List *MyList,IpAddress isip,int isport) { // Не доработанная функция сверки и добавления клиентов в список List *temp = MyList->Head; if (temp == NULL) { Add(isip, isport, MyList); } else { while (temp != NULL) { /*Почему не доработанная? если if (temp->ip != isip && temp->port != isport) то 1.1.1.1:20015 и 1.1.1.1:20025 не добаляет если if (temp->ip != isip || temp->port != isport) то при сверке 1.1.1.1:20015 и 1.1.1.1:20025 добавляет но при следующем заходе в функцию 1.1.1.1:20015 1.1.1.1:20025 1.1.1.1:20025 1.1.1.1:20025 1.1.1.1:20025 получается такая хрень в списке поскольку уже имеещиеся 1.1.1.1:20025 он сравнивает с 1.1.1.1:20015 и добаляет от того получается клон который засоряет память */ if (temp->ip != isip && temp->port != isport) { Add(isip,isport, MyList); } temp = temp->Next; } } } void ClearList(List *MyList) { while (MyList->Head != NULL) { List *temp = MyList->Head->Next; delete MyList->Head; MyList->Head = temp; } } int main() { setlocale(LC_ALL, ""); //Выделяем память для стека List *MyList = new List; MyList->Head = NULL; //инициализируем первый элемент // Создание соккета (UDP) и привязка порта UdpSocket socket; socket.bind(55002); socket.setBlocking(false); // Создание пакета, с помощью которого можно будет общатся с клиентом Packet packet; // Запрос и вывод СВОЕГО Ip адреса IpAddress ip = IpAddress::getLocalAddress(); cout << "Server created with ip: " << ip << ":" << socket.getLocalPort() << endl; // Буфер Хуюфер string name; string buffer = "Подключено к серверу!"; bool p = true; std::size_t received = 0; // Ип адресс отправителя и порт IpAddress sender; unsigned short port; while (true) { if (socket.receive(packet, sender, port) == sf::Socket::Done) { packet >> buffer >> name; if (buffer != "") cout << name << ": " << buffer << endl; Proof(MyList, sender, port); // сверка packet << buffer << name; //распаковка //socket.send(packet, sender, port); Send(MyList, sender, port, packet); packet.clear(); // показываем список если в буфере x if (buffer == "x" || buffer == 'x') { Show(MyList); } } sleep(sf::milliseconds(10));//Задержка } // сюда никогда не заходит ( еще до этого не дошел) ClearList(MyList); //Очищаем память. delete MyList->Head; delete MyList; system("pause"); return 0; } |
КЛИЕНТ
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include <SFML/Graphics.hpp> #include <SFML/Network.hpp> #include <SFML/Graphics/Text.hpp> #include <SFML/System/String.hpp> #include <SFML/Network/IpAddress.hpp> #include <iostream> #include <list> #include <string> #include <conio.h> using namespace std; using namespace sf; int main() { setlocale(LC_ALL, ""); string Mname; string name; // Создание соккета (UDP) и привязка порта sf::UdpSocket socket; socket.bind(55045); socket.setBlocking(false); // Создание пакета, с помощью которого можно будет общатся с клиентом Packet packet; // Буфер Хуюфер IpAddress ip = IpAddress::getLocalAddress(); string buffer = "Клиент подключился: " + ip.toString(); cout << "Введите имя: "; cin >> Mname; // Ип адресс отправителя и порт sf::IpAddress sender; unsigned short port; packet << buffer << Mname; socket.send(packet, "192.168.43.3", 55002); while (true) { if (_kbhit()) { cout << "Do it: "; cin >> buffer ; packet << buffer << Mname; socket.send(packet, "192.168.43.3", 55002); //Отправка данных packet.clear(); buffer.clear(); } if (socket.receive(packet, sender, port) == sf::Socket::Done) { packet >> buffer >> name; if (buffer != "") cout << name << ": " << buffer << endl; } sleep(sf::milliseconds(10));//Задержка } system("pause"); return 0; } |