Ряд вопросов

В этой теме 23 ответа, 5 участников, последнее обновление tyman tyman 8 года/лет, 2 мес. назад.

Просмотр 15 сообщений - с 1 по 15 (из 24 всего)
  • Автор
    Сообщения
  • #3119

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    Всем доброго времени суток)

    Какой функцией получить ип адресс (адресса) клиентов моего сервера (Уже UDP)

    Есть ли в SFML готовые списки ип адресов? Если нету, что более вероятно то что лучше использывать Массив или Список. И если есть примеры или мысли то натолкните на нужную или примером помогите.

    Буду вам очень признателен)

    #3120
    +2
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:61

    sf::IpAddress::getPublicAddress() для WWW(если соединение с клиентом через интернет) или sf::IpAddress::getLocalAddress() в LAN(если по локальной сети).

    #3121
    +2

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    Эти функции возвращают  Ип адресс той программы в которой они используются, а мне нужно На стороне сервера узнать подключенных клиентов.

    Вот как тут видно, я получаю сообщение от клиента и тем самым могу узнать его ип и порт. Но от этого легче не стало..

    Поскольку появился ряд вопросов.

    Как сделать список клиентов?

    Как узнать отключился ли клиент?

    Как отсылать всем клиентам сообщения?

    Как видно из цикла то при получении сообщения от клиента, я могу отправить только ему обратное сообщение.

    Действует некий прицип

    Клиент1 >> Сервер

    Сервер >> Клиент1

    Но если подключится еще один клиент то получается так

    Клиент1 >> Сервер

    Сервер  >> Клиент1

    Клиент2 >> Сервер

    Сервер >>Клиент 1

    А мне нужно что бы сервер работал со всеми клиентами и отправлял пакеты всем клиентам

    Клиент1 >> Сервер

    Сервер >> Клиент2, Клиент3, Клиент16….

    Для этого нужно сделать Массив Ип адресов ну или список, но немогу понять как???

    как сделать список?

     

    #3123
    +3
    tyman
    tyman
    Участник
    Сообщений:23

    Зарегистрирован:
    04.03.2015

    Репутация:6

     

    Список http://www.codenet.ru/progr/cpp/dlist.php

    Пускай когда клиент подключается ты проверяешь ip на наличие в списке.

    Если такой ip есть то обновляешь таймер если нету то добавляешь элемент в список.

    Если таймер закончился то удаляешь элемент

    Проходишь по списку и всем отправляешь нужные данные

    #3125
    +2

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    Спасибо) Сделал через список, правда для ип адресса использовал string, но я не понял зачем тут таймер, можешь обьяснить?

    Если у кого нибудь возник такой же вопрос ( как запихнуть в список ип адреса) то вот рабочий код

    Чтобы получить Ип в клиенте вам нужно отправить данные на сервер (любые)

    socket.receive(buffer, sizeof(buffer), received, sender, port);

    таким образом принимаем сообщение и добавляем в список

    Add(sender.toString(), port, MyList);

    Если у кого есть идеи получше пишите)

    #3130
    +1
    tyman
    tyman
    Участник
    Сообщений:23

    Зарегистрирован:
    04.03.2015

    Репутация:6

    String не выгодно. Как ты общался используя string? Отправка принимает ip, а не string

    Как узнать отключился ли клиент? Тут поможет таймер, если клиент не обновляет данные других игроков в течении 10 секунд, то клиент умер.

    #3131

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    А что же тогда использовать вместо string??

    Вот функция которая проверяет и добавляет нового клиента в список.

    Как по мне это оптимальный вариант, я не знаю что можно использовать вместо string.

    Ведь Ip (0.0.0.0) не целочисленный тип а кроме как string лучше варианта не вижу, поскольку не знаю..

    С таймером понял, но его пока не делал. Наверное сейчас буду реализовывать.

     

    #3132

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    Да, спасибо! Ты был прав по поводу Ip я не знал что что можно так сделать. Если бы ты не подсказал пришлось бы переводить string в ip, каким нибудь образом)

    #3133
    +1
    tyman
    tyman
    Участник
    Сообщений:23

    Зарегистрирован:
    04.03.2015

    Репутация:6

    Я столкнулся с парой проблем.

    1. Если ты отправляешь данные, а клиент не принимает то программа стоит афк.

    2. При передаче матрицы int больше 45×45 последнии строки не передается. Сервер пишет, что отправил, а клиент ждет приема.

     

    В документации были какие-то розетки с таймером ожидания передачи, но я так и не понял как ними пользоваться, по этому оптимальным есть передавать данные тому кто просит, а не всем по списку.

    #3135

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    А ты с чем мучаешься TCP/UDP?

    Я до этого не дошел, но мне кажется что пинговать сервер/клиент (чтобы знать есть клиент или нету) нужно через некий отдельный канал. то есть: клиент отправляет (в цикле естественно) конкретный пакет! А на сервере его сравнивать. допустим если клиент отправил пакет и этот пакет == нашему пакету. то не удалять из списка.

    1. Если ты отправляешь данные, а клиент не принимает то программа стоит афк.

    Вот этого не понял , с кодом может быть пойму. Может у тебя проблема с ожиданием

    ведь если у сервера/клиента в цикле такая строка то программа замирает пока не получит пакет и строки дальше не читаются.

    Но это можно легко исправить таким if`ом

    И тогда даже если пакет не пришел то выполнение кода не стоит а продолжается.

    2. При передаче матрицы int больше 45×45 последние строки не передается. Сервер пишет, что отправил, а клиент ждет приема.

    Опиши тут то я точно не понял. Массив[45][45]?

    А передача частями?

    В документации были какие-то розетки с таймером ожидания передачи, но я так и не понял как ними пользоваться, по этому оптимальным есть передавать данные тому кто просит, а не всем по списку.

    Можно ссылку. по документации вообще нужно быть осторожным, я оттуда код скописатил, а там была в какойто сторке ошибка имени переменной Func  —  func как то так. И я 2 часа мучался, и библиотеки подключал( что я короче не делал) но нашел))) злой был пи….ц!)

    А вот по поводу Розеток(socket)  мне кажется это касалось TCP. Но не уверен.

    #3138
    +1
    tyman
    tyman
    Участник
    Сообщений:23

    Зарегистрирован:
    04.03.2015

    Репутация:6

    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 элементов, по этому ждёт, а сервер пишет, что все отправлено. Тут надо быть окуратным.

    #3142

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    1. На виртуальных серверах ограниченое количество подключений tcp. Здесь выгодней udp так как не надо резервировать места.

    Тут ты имеешь ввиду хостинг??

    2. У меня сервер генерировал карту и отправлял клиенту. Нужно передать всю карту, mas[45][45]. Отправлял цыклом, по 45 элементов за передачу. Если масив 46×46 то 46-тая передача не доходила. Клиент знает, что должно прийти 46 писем, по 46 элементов, по этому ждёт, а сервер пишет, что все отправлено. Тут надо быть окуратным.

    А ты уверен что карта должна генерироватся на сервере?? Мне кажется что это не целесообразно, как по мне карта генерируется у клиента и все обьекты. и при запросе клиента сервер говорит есть ли некий обьект на карте (моб,дерево,трава) или же нету. Хотя это зависит от твоей задачи, наверно.

    Такой вопрос, как ты сделал (если сделал) такую функцию

    Клиент 1 >> Сервер

    Cервер >> Клиент 2, 3, 4 …

    #3143

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    Не могу решить проблем.

    socket.recieve(); программа замирает в этом месте если нету принятых пакетов.

    думал что if (socket.recieve() != sf::Socket::Done)

    исправит это но нифига, все равно программа останавливается в этом месте и ждет пакета, может есть варианты??

    #3144
    +1
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    mypmyp, в данном случае тебе нужно использовать sf::SocketSelector. Добавляешь в него сокеты, а затем проверяешь методом isReady, если возвращают true => в сокет была записана информация. Вот пример из документации:

     

    #3145

    mypmyp
    Участник
    Сообщений:20

    Зарегистрирован:
    20.10.2015

    Репутация:6

    А разве  это проканает с UDP???

Просмотр 15 сообщений - с 1 по 15 (из 24 всего)

Для ответа в этой теме необходимо авторизоваться.