Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
1

Сетевая игра

17.11.2011, 11:11. Показов 5305. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, Господа Программисты.
На моём счету 2 хорошие сетевые игры, но у обоих проблемы.
В первой только учился, реализовывал связь через NMUDP. То есть включил игру, выбрал кто-ты, сервер or клиент. Если сервер то к тебе мог подключится 1 клиент.
Во второй уже делал 2 приложения, сервер и клиент отдельно на основе idUDPServer and idUDPClient, к серверу могли подключится до скольки хош игроков.
В обоих такая проблема:
К серверу мог подключится только игрок у которого компьютер напрямую подключен к интернету. Во второй игре клиент был основан на idUDPServer и idUDPClient, сервер только на idUDPServer. (Клиентская часть: Так как у idUDPClient я не нашёл чего-то типо onRead, то юзал idUDPServer.)
На сколько я знаю сеть то сервер может быть только при прямом подключение к интернету, либо при проброске портов. Так вот, когда к серверу приходили пакеты он их считывал, парсил, и отправлял клиенту, конечно если клиент был на прямую подключен к интернету то до него пакеты доходили и всё было ок. Но как только клиень сидел из под роутера или wi-fi соединения, в общем без прямого подключения к нету то пакеты не доходили и на клиенте ничего не происходило.
Сейчас опять взялся за написание сетевой игры, но теперь хочется сделать по нормальному, чтобы как например в CS, CSS, Minecraft, в этих играх пакеты от сервера доходят даже если ты через 3 роутера сидишь Раз за разом перечитывая и переписывая исходники Minecraft'a дошёл до того что там вообще всё соединение реализовано стандартным WINAPI через socket, WSA_Startup, etc... (UDP)
Так вот как бы мне сделать такое в своей игре не прибегая к WINAPI напрямую, хочется через Indy.
Надеюсь и блогадорю вас за вашу помощь. Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2011, 11:11
Ответы с готовыми решениями:

Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново?
Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново? unit1.cpp void...

Системная или сетевая ошибка
Здравствуйте! Приложение написано в C++Builder 6 в Windows XP. Запускаю приложение в Windows 7,...

Сетевая карточная игра "Дурак"
https://www.dropbox.com/home?preview=1igra_durak.rar

дисковая или сетевая ошибко
я читал вот эту тему...

13
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
17.11.2011, 11:25 2
создайте условия, чтобы клиент мог подключиться к серверу,
попробуй пингом проверить
0
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
17.11.2011, 11:32  [ТС] 3
Используется только UDP, в UDP в принципе на сколько я знаю нет соединения, он может слать пакеты даже если сервер на конечной рабочей станции не запущен.
Как тогда быть?
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
17.11.2011, 11:34 4
пинг до сервера проходит?
0
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
17.11.2011, 11:38  [ТС] 5
из-под cmd да. Не доходят пакеты из моей игры. Так как пакеты напрямую отправляю на IP пользователя. А это же может быть и IP роутера. Как быть?
отправка:
C++
1
2
3
4
5
6
bool SendPacket(AnsiString IP, AnsiString Packet)
{
  try{frmMain->Server->Send(IP,(short)32146,Packet);}
  catch(...){return false;}
  return true;
} // В очень редких случаях возвращает false, сделал boolean так просто для само-контроля))
0
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
17.11.2011, 11:48 6
подобная темя совсем недавно обсуждалась, пройдись по темам!
0
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
17.11.2011, 11:51  [ТС] 7
Я пересматриваю темы на этом форуме по 10 раз на дню...не замечал. Подкинул бы ссыль, был бы очень благодарен.)
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
17.11.2011, 12:05 8
Игра по сети через интернет (сокеты).
1
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
17.11.2011, 12:08  [ТС] 9
Уже читал. Смысла не уловил.
Тот кто держит сервер моей игры у него конечно-же статический IP, и нормальные клиенты к нему нормально цепляются.
А вот если клиент из под роутера, wi-fi'я уже обратно к клиенту пакеты не даходят.
Я прошу одного, объясните как сделано соединение клиент\сервер в том же Counter-Strike, CSS, Minecraft, War-craft, там без разницы под чем и где сидит клиент, главное чтобы у сервера был статический (выделенный) IP?
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
17.11.2011, 12:22 10
сначала нужно, чтобы клиент смог подключиться к серверу.
при удачном подключении сервер обрабатывает запрос и отправляет результат на тот ип:порт, с которого пришел запрос.
в твоей программе тебе уже известен сокет, связывающий сервер и клиент; он создаётся, когда клиент подключается к серверу. вот в этот сокет и нужно отправлять результат от сервера клиенту.
1
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
17.11.2011, 12:30  [ТС] 11
при удачном подключении сервер обрабатывает запрос и отправляет результат на тот ип:порт, с которого пришел запрос.
Я так и делаю.
в твоей программе тебе уже известен сокет, связывающий сервер и клиент; он создаётся, когда клиент подключается к серверу. вот в этот сокет и нужно отправлять результат от сервера клиенту.
А вот это точно...припоминается что-то такое...щас буду пробывать, спасибо тебе kzru_hunter, от души
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
17.11.2011, 12:40 12
Цитата Сообщение от kzru_hunter
при удачном подключении сервер обрабатывает запрос и отправляет результат на тот ип:порт, с которого пришел запрос.
Цитата Сообщение от Matrica Посмотреть сообщение
Я так и делаю.
если у в программной части клиента прописан статический порт и если клиент отправит запрос серверу, то когда запрос пройдет через роутер, то исходящий ип-адрес и порт пакета будут изменены роутером.
когда сервер получит такой пакет и после этого сервер попробует обратно напрямую клиенту что-то отправить на тот самый порт, который прописан в коде клиента, то ничего не выйдет.
пакет пришел от роутера, значит и ему нужно отправлять обратно через уже открытый сокет.
0
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
17.11.2011, 12:43  [ТС] 13
Ну в общем на сколько я понял нужно через сокет который при подключении создаётся отправлять, типо он содержит информация для роутера например, куда передать? Но на сколько я знаю UDP не создаёт подключений, значит сокетов тоже? Или я что-то не понимаю? Разъясните пожалуйста незнающему?))
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
17.11.2011, 13:16 14
UDP также использует сокеты. про UDP лучше почитать в инете, а то если я начну объяснять, то могу кое где неправильно сказать
1
17.11.2011, 13:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2011, 13:16
Помогаю со студенческими работами здесь

сетевая БД с несколькими пользователями, есть взаимодействие с mysql сервером
Помогите, пожалуйста, определится с выбором: сетевая БД с несколькими пользователями, есть...

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

Сетевая игра
Я пишу игру Монополия, пока делаю несетевую версию (т.е. люди должны быть за 1 компом), в планах...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru