Созданные ответы форума
-
АвторСообщения
-
Попробуй чистить пакет.
packet.clear();Он не принимает порт, он принимает переменную куда запишет порт от куда пришло
Уже увидел
Ты забыл забиндеть порт.
if (socket.bind(5400) != sf::Socket::Done) {// error… }
Тут все правильно, дай больше инфы.
Проверь соотвецтвие типа данных пакета и сервера айпи
Да
На c++ sfml. Чем тебя стандартные возможности не устраивают?
На крайняк php.
Рекомендую почитать туториал: http://www.sfml-dev.org/tutorials/2.3/
Значит так. На сервере Был список с пользователями:
struct user{
String name;
int x, y;
user *next;
};
Когда кто то ходил, то на сервер приходил пакет: {
int state; //Чего хочет клиент: 1-регистрация, 2-ход, 3-ожидание
String name;//Имя
char nap;//Направление W, S, A, D
};Если регистрация то сервер проверял имя(на занятость), отправлял размер карты и саму карту;
Если ход то проверял имя, двигал фигурку(проверяло на стены), отправлял данные назад;
Если ожидание то отправлял данные;Данные которые сервер отправлял назад выглядели:
Первый пакет содержал количество пользователей;
А дальше отправлялись имена и координаторы;В клиенте всё это добро выставлялось на экран;
Камера выставлялась на координатах того кто имел клиентское имя;Пинг штука страшная, видно как пакеты теряются на глазах.
У меня сервер обрабатывал все данные, если ты нажал в лево, то на сервер отправлено букву с направлением, сервер ходил тем персонажем и отправлял положение всех персонажей обратно. Но дело было так:
Когда подключался к серверу я, все работало как часы.
Когда подключался второй игрок, то он отставал, мой персонаж бегал быстрее.
Когда подключался третий, лагало словно из Европы в Китай.
1. На виртуальных серверах ограниченое количество подключений tcp. Здесь выгодней udp так как не надо резервировать места.
Ссылка на розетки http://www.sfml-dev.org/tutorials/2.3/network-socket.php
Начинается с надписи Blocking on a group of sockets
2. У меня сервер генерировал карту и отправлял клиенту. Нужно передать всю карту, mas[45][45]. Отправлял цыклом, по 45 элементов за передачу. Если масив 46×46 то 46-тая передача не доходила. Клиент знает, что должно прийти 46 писем, по 46 элементов, по этому ждёт, а сервер пишет, что все отправлено. Тут надо быть окуратным.
Я столкнулся с парой проблем.
1. Если ты отправляешь данные, а клиент не принимает то программа стоит афк.
2. При передаче матрицы int больше 45×45 последнии строки не передается. Сервер пишет, что отправил, а клиент ждет приема.
В документации были какие-то розетки с таймером ожидания передачи, но я так и не понял как ними пользоваться, по этому оптимальным есть передавать данные тому кто просит, а не всем по списку.
String не выгодно. Как ты общался используя string? Отправка принимает ip, а не string
Как узнать отключился ли клиент? Тут поможет таймер, если клиент не обновляет данные других игроков в течении 10 секунд, то клиент умер.
C++12345struct comp {IpAddress ip;int timer;comp* next; //Ссылка на следущий элемент списка};Список http://www.codenet.ru/progr/cpp/dlist.php
Пускай когда клиент подключается ты проверяешь ip на наличие в списке.
Если такой ip есть то обновляешь таймер если нету то добавляешь элемент в список.
Если таймер закончился то удаляешь элемент
Проходишь по списку и всем отправляешь нужные данные
C++12345678910111213141516171819struct a{...a *next;};....a *p = new a;p->next = 0;...a *list1 = p, *list2 = p;....//Вот тут проходишь по спискуwhile (list1->next != 0){list2 = list1;while (list2->next != 0){...//удаляешь где таймер не подходит...//отправляешь,list2 = list2->next;}list1 = list1->next;}Пробовал 12000 пикселей, не вышло.
-
АвторСообщения