Сетевой преферанс

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Anatoliy
Сообщения: 4
Зарегистрирован: 31 авг 2005, 11:45

Пишу на C++ с использованием WinSock преферанс для игры по локальной сети или Интернет. Имеется хостинг (не выделенный сервер) с поддержкой mysql. Mysql используется для хранения информации об игроках, занятых столах, состоянии игрового мира за каждым столом.
Игрок первым севший за стол является сервером в данной игре. Игроки, севшие вторым и третим являются клиентами.
Интересует: как второму и третиму игроку найти первого, чтобы подключиться?

Есть вариант: первый игрок оставляет свой IP в базе данных mysql, второй и третий считывают его и подглючаются. Однако, на мой взгляд, это не очень хороший способ.
По локалке вроде возможно осуществить массовую рассылку (что-то, вроде x.x.x.255) на все компы и сервер откликнется на соответств.запрос. Возможна ли такая рассылка в Интернете?
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

нет.
А даже если и возможно то умрешь раньше чем всем разошлешь.
Ты представь сколько адресов в инете !!!!
Надо оставлять ай.пи тока лучше шифрованным
В SAD - все в SAD.
Anatoliy
Сообщения: 4
Зарегистрирован: 31 авг 2005, 11:45

Kolinus, на счет шифрования - хорошее замечание.

Возникает вопрос, если во время игры отключается сервер или клиент как лучше поступать? Необходимо учитывать, что отключение может произойти случайно, например, шнур отошел и т.п. и игрок через 1-2 минуты снова может подключиться. Другими словами, если кто-то отключился это не значит, что игру необходимо заканчивать. Как игрокам правильно найти друг друга после восстановления связи? Снова ставить сокет в режим ожидания listen (в случае отключения клиента). Пытаться connect сокетом клиента к ip который находится в БД определенное время (в случае отключ.сервера). Или может какое-нибудь другое решение?
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Так не получится потому как у сервера может быть динамический ай пи и не факт что при следующем подсоединении он совпадет - то есть к нему уже не подключилься через тот ай-пи
по этому скорее всего надо расчитывать не на связку по адресу (раз уж ты о таких вариантах использования задумываешься)

как вариант можно написать на хостинге скрипт который будет всем этим делом манипулировать и разработать свой протокол для передачи - например при начале игры генерируется уникальный код и тогда после обрыва (если игра не выключалась ) можно будет найти "беглеца"

P.S. мне кажется что к С данная тема отношения пока не имеет ;) .
В SAD - все в SAD.
Anatoliy
Сообщения: 4
Зарегистрирован: 31 авг 2005, 11:45

Предположим соединение между сервером и клиентом установлено, далее сервер меняет свой ip. Соединение между клиентом и сервером останется или нет?
можно написать на хостинге скрипт
Не совсем ясно, зачем писать скрипт, если аналогичные вещи можно реализовать в программе (тем самым соблюдается автономность)?
генерируется уникальный код и тогда после обрыва (если игра не выключалась ) можно будет найти "беглеца"
Зачем, если оставшиеся игроки и так узнают о том, кто вылетел, получив соответствующее сообщение, по-моему FD_CLOSE при использовании WSAAsyncSelect(...)? И причем здесь уникальный код?
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

а как ты собираешься узнать что это именно тот комп, если у него меняется ай-пи.
в случае смены адресса соединение должно пропасть поскольку пакеты будут отправляться на старый адрес
а скрипт на хостинге как раз и занимается тем чтобы идентифицирвовать человека, поскольку если использовать идентификацию по адресу то ты не можешь гарантировать что при разрыве сможешь корректно продолжить игру
В SAD - все в SAD.
Anatoliy
Сообщения: 4
Зарегистрирован: 31 авг 2005, 11:45

Я думаю следующим образом. В базе данных находится ip адрес сервера данного стола. Предположим у сервера изменился ip. В этом случае

клиенты
1.получают соответствующее сообщение FD_CLOSE
2.вызывают функцию, которая в БД ищет ip сервера своего стола
3.пытается подключиться к найденному ip.
Эту функцию можно вызывать несколько раз.

сервер
1.получает сообщение FD_CLOSE
2.вызывает функцию, которая определяет собственный ip
3.заносит собственный ip в БД
3.ставит сокет в режим listen

Kolinus, я видимо понял что ты на счет идентификации имеешь ввиду. Если у сервера сменится ip, его старый адрес может занять кто-нибудь другой, кто тоже хочет играть. В этом случае, если клиенты подключаться к этому новичку получится хаос. Если ты именно эту проблему имеешь ввиду, то ее можно обойти. Предположим произошел сбой связи. После восстановления и повторного подключения клиентов к серверу осуществить обмен логинами, которые уникальны, ест-но каждый игрок знает логины остальных соперников. Если логины совпали - игра продолжается.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Даже если ентот адрес никто не занял а у сервера просто другой - восстановление игры невозможно.
Посему было предложение про управляющий скрипт - который умеет всех координировать.
Либо отказаться от идеи восстановления игры после сбоя.
В SAD - все в SAD.
Ответить