Отправить сообщение на все подключенные машины, используя Delphi, используя UDP или другой низкоуровневый метод? - PullRequest
0 голосов
/ 20 марта 2012

Я создаю игру и хочу поговорить со всеми клиентами сразу с моего игрового сервера. (Оригинальный вопрос: Как составить список IP-адресов, обновленный вопрос: как сделать UDP-трансляцию.)

И я хочу установить LAN-соединение между игроками. Теперь я не понимаю, как найти все подключенные машины, чтобы отправить им сообщение с информацией о сервере. Или как отправить UDP всем с помощью Synapse?

1 Ответ

5 голосов
/ 20 марта 2012

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

Причина № 1, почему трудно перечислять IP-адреса из-за того, что многиеподключенные компьютеры вообще не будут отвечать ни на что, включая Ping.Вторая проблема заключается в том, что вам придется транслировать по всем локальным адресам, если вы хотите перечислить компьютеры в текущем сегменте, и это займет много времени и не будет полным, поскольку вполне возможно, что сегмент вашей локальной сети мог быиметь несколько наборов IP-адресов, возможно, в нескольких разных подсетях private-ip и в одной или нескольких подсетях public-ip.

Если вы создаете игру и написали игровой сервер на основе TCP, ваша играСервер знает, кто в данный момент подключен к серверу, и вы сможете проходить активные сеансы.Код для этого будет другим для Indy, ICS, Synapse или любой другой библиотеки, которую вы используете для написания кода вашего сервера протокола TCP / IP или UDP.Вы можете использовать широковещательное UDP-сообщение , но это может быть неправильным решением для некоторых игровых систем.Представьте, что вы используете два сервера на одном компьютере, и некоторые игроки подключены к каждому.Решение, ориентированное на соединение, является более надежным.Ваши клиенты могут по-прежнему использовать UDP и могут опрашивать сервер, к которому они подключены, и получать уведомления о событиях с помощью флагов в вашем протоколе.Это было бы гораздо надежнее, чем попытка многоадресной передачи или широковещательной передачи в ЛВС.

Однако Synapse поддерживает синтаксис широковещательной передачи, если вы настаиваете:

 socket := TUDPBlockSocket.create;
 socket.enablebroadcast(true);
 socket.Connect('255.255.255.255', '12345')
 socket.SendBufferTo(@DATARECORD, SIZEOF(DATARECORD));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...