2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Обмен данными через сеть (Delphi): где почитать?
Сообщение06.08.2010, 19:26 
Заслуженный участник


27/04/09
28128
Хотелось бы написать (к слову, довольно простую, типа шашек) игру, которая могла бы соединить игроков по сети. Что-то я упустил и не знаю, какие классы или функции WinAPI (и в каких они модулях, либо какие компоненты) использовать и каким образом. Подскажите что-нибудь или посоветуйте. Буду рад и фрагментам кода.

Насколько я знаю, обоим программам для обмена данными нужны IP-адреса друг друга (или хотя бы одной?), значит ли это, что используется протокол TCP/IP? (Это побочный вопрос, если я узнаю, что там делать, он, конечно, отпадёт сам собой. Он на случай, если ничего никто не знает — тогда хотя бы это.)

Как понимаю, программе нужно "уметь" обработать приём и передачу пакетов и какие-нибудь связывания-развязывания?

Увы, я даже не знаю протокола TCP/IP, надеясь, что это мне не понадобится. :oops: Это, наверно, нехорошо.

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение06.08.2010, 20:14 
Заслуженный участник


28/04/09
1933
Смотря что Вы подразумеваете под сетью.
Если имеется в виду локальная сеть, то можно обойтись знанием имен компьютеров и использовать именованные каналы, англ. Named Pipes (ссылки на примеры прилагаются).
Если интернет, то лучше, конечно, использовать универсальное средство - сокеты, они же Windows Sockets или Winsock (пригодное также и для предыдущего случая). Проще всего использовать UDP-сокеты, принцип действия которых схож с работой почтовых служб (а не телефона). При передаче важных данных лучше пользоваться TCP-сокетами (которые являются надстройкой над UDP-собратьями), т.к. "из коробки" поддерживают механизм определения пропажи пакетов (в случае если пакет не доходит, об этом становится известно принимающей стороне). Однако скорость передачи в этом случае будет далеко не высокой, кроме того механизм подключения тут сложнее, чем в UDP-сокетах (собственно, потому что это реальное подключение по принципу телефона). В серьезных приложениях обычно пишут что-либо специализированное на основе UDP-сокетов, включающее те функции, которые необходимы разработчикам.
Надо сказать, что в MSDN данная тема (межпроцессное взаимодействие, Interprocess Communications, IPC) описана весьма неплохо, к большинству механизмов есть примеры.
А вообще тема интересная, хотя и довольно сложная. Здесь и тип архитектуры системы (с единым сервером или же распределенная), выбор типа IPC (каналы, сокеты, почтовые ящики...), выбор способа организации функционирования приложения (однопоточное или многопоточное) и соответствующая разновидность связей (синхронные или асинхронные). В случае использования архитектуры клиент-сервер, программный комплекс состоит уже из двух программ, обозначенных в названии подхода.

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение06.08.2010, 20:26 
Заслуженный участник


27/04/09
28128
Спасибо! Да, будет клиент-сервер.

-- Пт авг 06, 2010 23:27:33 --

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

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение06.08.2010, 20:44 
Заслуженный участник


09/08/09
3438
С.Петербург
В Windows для разработки программ, взаимодействующих по TCP/IP, используется библиотека WinSock2 и упрощённая надстройка над ней под названием WinINet. В Delphi, насколько я помню, всё это дело достаточно хорошо поддерживается. Почитать можно, например, в книжке Кожедуб и др. Разработка сетевых приложений в Delphi

Но при организации взаимодействия точка-точка через интернет есть одна проблема, которую без использования сервера решить весьма непросто.
Есть два типа IP-адресов: публичные (уникальные на всём пространстве интернета) и приватные (уникальные только в пределах одной локальной сети). Если два игрока находятся в разных локальных сетях и, соответственно, их компьютеры имеют только приватные IP-адреса, то установить между ними TCP/IP-соединение или отправить с одного на другой UDP-посылку простыми способами (без специальной настройки файрвола) не получится.
Правда торент-клиенты как-то умудряются организовывать раздачу без настройки файрвола, но как они это делают, я не знаю :(

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение06.08.2010, 20:54 
Заслуженный участник


27/04/09
28128
Хм...

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение06.08.2010, 22:40 


23/11/09
58
arseniiv в сообщении #343001 писал(а):
Хм...


всё, что написано выше - всё верно =) Но кроме огромной кучи компонентов "+" у Delphi по-моему особо и нет.
Поэтому есть проблема для реализации - ищем компонент. Мне кажется, если вы собрались делать игру с сетевым взаимодействием - попробуйте DelphiX.

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение07.08.2010, 00:52 
Заслуженный участник


26/07/09
1559
Алматы
2arseniiv
Гляньте, у вас с delphi должен поставляться пакет Indy. Хорошая вещь и примеров много.

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение08.08.2010, 10:37 
Аватара пользователя


31/10/08
1244
Для Delphi существует огромная куча компонентов для работы с сетью. К примеру Indy. Я лично предпочитаю чистый Win API а именно библиотеку winsock.

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

UDP и TCP протоколы совершенно разные.

Цитата:
Насколько я знаю, обоим программам для обмена данными нужны IP-адреса друг друга (или хотя бы одной?)
Вначале они могут не знать IP адрес. Есть широковещательная посылка.
Клиент посылает пакет всем компьютерам в сети сервер его ловит опознает клиента. Тем самым запоминает его IP адрес. И отправляет ответ. Тем самым каждая программа клиент и сервер знает IP друг друга.

Если у тебя два компьютера в двух разных локальных сетях, то тут используется сервер посредник который находится в интернете.

Цитата:
Как понимаю, программе нужно "уметь" обработать приём и передачу пакетов и какие-нибудь связывания-развязывания?


Есть понятие соединение. Но оно есть не во всех протоколах. К примеру в UDP нет, а в TCP есть.
А вот про обработку пакетов. Это тоже заблуждение. Пакеты есть в UDP. А вот в TCP передача потоковая. И надо обрабатывать не пакеты, а сегменты данных.

Цитата:
TCP/IP-соединение или отправить с одного на другой UDP-посылку простыми способами (без специальной настройки файрвола) не получится.
Правда торент-клиенты как-то умудряются организовывать раздачу без настройки файрвола, но как они это делают, я не знаю :(


Во первых фаервол настраивать не надо обычно он уже настроен в 99 из 100.
Вот почитайте про то как устроен NAT и способы его преодоления.
http://www.cyberguru.ru/networks/networ ... tails.html


А во вторых торрент-клиенты умеют обходить фаерволы для этого у них есть разные способы. Начиная договорится с фарволом при помощи UPNP или NAT-PMP. Так и просто работать на обратной связи. Так и маскироваться под Http.

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение08.08.2010, 11:22 
Заслуженный участник


26/07/09
1559
Алматы

(2Pavia)

Pavia писал(а):
А вот про обработку пакетов. Это тоже заблуждение. Пакеты есть в UDP. А вот в TCP передача потоковая. И надо обрабатывать не пакеты, а сегменты данных.

Ну это вы зря. В русскоязычных текстах сплошь и рядом используется термин TCP-пакет. Это нормально, не самая страшная ошибка. :)

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение08.08.2010, 22:24 
Аватара пользователя


03/03/10
1341
Я тоже хочу такую написать, только не шашки, а го. Главная проблема в том, как программе сделать поиск готовых к игре игроков.
Мой вариант реализации: программы отсылают на сервер, в роли которого выступает мой сайт, информацию о своём IP-адресе, по которым находят друг друга. Хотелось бы обойтись без сервера.

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение08.08.2010, 22:53 
Заслуженный участник


27/04/09
28128
Мой вариант реализации — игроки знакомы и обмениваются IP сами. :-)

 Профиль  
                  
 
 Re: Обмен данными через сеть (Delphi): где почитать?
Сообщение08.08.2010, 23:10 
Аватара пользователя


31/10/08
1244
Я думаю без сервера не обойтись. В интернете на сколько я знаю не любят широко вещательные пакеты.
VoIP используют stun сервера. О них рассказана в той ссылке что я дал в предыдущем посте. В принципе вам тоже некто не мешает им воспользоваться.

Еще как вариант постоянно держать порт открытым, на него должны приходить данные или уходить. Есть понятие аренды порта. Шлюз придерживает порт за одним компьютером некоторое время. Собственно это касается и IP адреса если он динамический. Велика вероятность получить его снова даже по прошествии определенного время. Для IP это от нескольких часов обычно 24 до нескольких дней(недели).
А вот порт от нескольких секунд до не знаю скольких. С учетом того что это используется в пиринговых сетях то наверно тоже несколько часов или дней.

Можно выделить группу портов. И пусть клиенты пробуют подсоединится. Велика вероятность, что получится. А да диапазон должен быть узкий иначе велика вероятность что фаервол сочтет это атакой и забанит.


Что касается без серверного метода. В пиринговых сетях есть еще такой метод. Но врятли он подойдет. Так как у них нет централизованного сервера. Пир может обратиться к известным пирам(которых он к примеру помнит с предыдущего сеанса) с просьбой прислать IP:порт известных им пиров. Т.е обмен пирами. По мимо этого можно запросить хэш у известных пиров так чтобы те спросили у своих "друзей", а те у своих "друзей" и тд. Но такой способ хорошо работает при большом числе пиров. Когда постоянно онлайн находится определенное число.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group