Страница 1 из 1
Сетевой преферанс
Добавлено: 31 авг 2005, 13:59
Anatoliy
Пишу на C++ с использованием WinSock преферанс для игры по локальной сети или Интернет. Имеется хостинг (не выделенный сервер) с поддержкой mysql. Mysql используется для хранения информации об игроках, занятых столах, состоянии игрового мира за каждым столом.
Игрок первым севший за стол является сервером в данной игре. Игроки, севшие вторым и третим являются клиентами.
Интересует: как второму и третиму игроку найти первого, чтобы подключиться?
Есть вариант: первый игрок оставляет свой IP в базе данных mysql, второй и третий считывают его и подглючаются. Однако, на мой взгляд, это не очень хороший способ.
По локалке вроде возможно осуществить массовую рассылку (что-то, вроде x.x.x.255) на все компы и сервер откликнется на соответств.запрос. Возможна ли такая рассылка в Интернете?
Добавлено: 31 авг 2005, 14:09
Kolinus
нет.
А даже если и возможно то умрешь раньше чем всем разошлешь.
Ты представь сколько адресов в инете !!!!
Надо оставлять ай.пи тока лучше шифрованным
Добавлено: 31 авг 2005, 14:26
Anatoliy
Kolinus, на счет шифрования - хорошее замечание.
Возникает вопрос, если во время игры отключается сервер или клиент как лучше поступать? Необходимо учитывать, что отключение может произойти случайно, например, шнур отошел и т.п. и игрок через 1-2 минуты снова может подключиться. Другими словами, если кто-то отключился это не значит, что игру необходимо заканчивать. Как игрокам правильно найти друг друга после восстановления связи? Снова ставить сокет в режим ожидания listen (в случае отключения клиента). Пытаться connect сокетом клиента к ip который находится в БД определенное время (в случае отключ.сервера). Или может какое-нибудь другое решение?
Добавлено: 31 авг 2005, 17:02
Kolinus
Так не получится потому как у сервера может быть динамический ай пи и не факт что при следующем подсоединении он совпадет - то есть к нему уже не подключилься через тот ай-пи
по этому скорее всего надо расчитывать не на связку по адресу (раз уж ты о таких вариантах использования задумываешься)
как вариант можно написать на хостинге скрипт который будет всем этим делом манипулировать и разработать свой протокол для передачи - например при начале игры генерируется уникальный код и тогда после обрыва (если игра не выключалась ) можно будет найти "беглеца"
P.S. мне кажется что к С данная тема отношения пока не имеет

.
Добавлено: 01 сен 2005, 22:47
Anatoliy
Предположим соединение между сервером и клиентом установлено, далее сервер меняет свой ip. Соединение между клиентом и сервером останется или нет?
можно написать на хостинге скрипт
Не совсем ясно, зачем писать скрипт, если аналогичные вещи можно реализовать в программе (тем самым соблюдается автономность)?
генерируется уникальный код и тогда после обрыва (если игра не выключалась ) можно будет найти "беглеца"
Зачем, если оставшиеся игроки и так узнают о том, кто вылетел, получив соответствующее сообщение, по-моему FD_CLOSE при использовании WSAAsyncSelect(...)? И причем здесь уникальный код?
Добавлено: 02 сен 2005, 13:39
Kolinus
а как ты собираешься узнать что это именно тот комп, если у него меняется ай-пи.
в случае смены адресса соединение должно пропасть поскольку пакеты будут отправляться на старый адрес
а скрипт на хостинге как раз и занимается тем чтобы идентифицирвовать человека, поскольку если использовать идентификацию по адресу то ты не можешь гарантировать что при разрыве сможешь корректно продолжить игру
Добавлено: 02 сен 2005, 16:56
Anatoliy
Я думаю следующим образом. В базе данных находится ip адрес сервера данного стола. Предположим у сервера изменился ip. В этом случае
клиенты
1.получают соответствующее сообщение FD_CLOSE
2.вызывают функцию, которая в БД ищет ip сервера своего стола
3.пытается подключиться к найденному ip.
Эту функцию можно вызывать несколько раз.
сервер
1.получает сообщение FD_CLOSE
2.вызывает функцию, которая определяет собственный ip
3.заносит собственный ip в БД
3.ставит сокет в режим listen
Kolinus, я видимо понял что ты на счет идентификации имеешь ввиду. Если у сервера сменится ip, его старый адрес может занять кто-нибудь другой, кто тоже хочет играть. В этом случае, если клиенты подключаться к этому новичку получится хаос. Если ты именно эту проблему имеешь ввиду, то ее можно обойти. Предположим произошел сбой связи. После восстановления и повторного подключения клиентов к серверу осуществить обмен логинами, которые уникальны, ест-но каждый игрок знает логины остальных соперников. Если логины совпали - игра продолжается.
Добавлено: 02 сен 2005, 18:56
Kolinus
Даже если ентот адрес никто не занял а у сервера просто другой - восстановление игры невозможно.
Посему было предложение про управляющий скрипт - который умеет всех координировать.
Либо отказаться от идеи восстановления игры после сбоя.