Я хочу знать, как связать два компьютера для моей онлайн-игры.
Я сделал это с помощью сокета сервера и сокета клиента, и он работает. Но как я могу сделать то же самое, если неизвестно, где эта программа работает. Поэтому я не могу подключиться, потому что я не знаю, кто является сервером. Мне сказали, что я могу отправить широковещательное сообщение, но теперь это третий день моих бесконечных попыток сделать это …
Я пытался написать это так (C ++ Builder 6):
ClientSocket->Socket->SendText("Message");
Адрес и хост 192.168.0.255;
И я запускаю его дважды на одном компьютере одновременно, но он не работает (потому что я не знаю, что делать потом)).
Пожалуйста, помогите мне найти сервер, который я не знаю заранее.
Мне сказали, что я могу отправить широковещательное сообщение
Это один из способов сделать это, да (это не единственный способ). Однако это работает только в том случае, если клиентский ПК и серверный ПК подключены к одной сети.
Серверное приложение может открыть два сокета прослушивания, один для TCP и один для UDP (только IPv4) или Multicast (IPv4 или IPv6). IPv6 не поддерживает широковещательную рассылку UDP, поэтому вместо нее следует использовать Multicast.
Клиентское приложение может затем:
для UDP отправьте сообщение на порт UDP, используя широковещательный IPv4-адрес подсети, к которой он подключен. Сообщение будет доставлено на каждое устройство, подключенное к этой подсети. Если серверный ПК подключен к той же подсети и серверное приложение получает широковещательное сообщение, оно может отправить ответ обратно на адрес IPv4, который отправил широковещательную рассылку. Когда клиентское приложение получит ответ, оно будет знать адрес IPv4, который отправил ответ.
для многоадресной рассылки подпишитесь на адрес группы многоадресной рассылки на ПК сервера. Сервер может периодически отправлять свой текущий IP-адрес группе, и все клиенты, которые подписаны на ту же группу, получат его. Когда клиент получит сообщение, он будет знать IP-адрес, который отправил сообщение.
Как только клиент обнаружил IP-адрес сервера, он может подключить свой TCP-сокет клиента к этому IP-адресу с помощью порта TCP.
Если два компьютера не находятся в одной сети (т.е. они подключаются через Интернет), то вышеупомянутое не применяется. Сервер должен будет опубликовать свой текущий IP-адрес где-нибудь, чтобы клиент мог его найти, например, на общедоступном веб-сайте или в службе динамического DNS.
Конечно, самое простое решение — просто спросить администратора сервера о текущем TCP / IP-адресе сервера, а затем при необходимости ввести его в конфигурацию своего клиентского приложения.
Я пытался написать это так (C ++ Builder 6):
ClientSocket-> socket-> SendText ( «Message»);
TClientSocket
использует TCP / IP. Для отправки широковещательной рассылки по подсети с использованием UDP вам необходимо использовать компонент UDP. C ++ Builder 6 поставляется с FastNet, который имеет TNMUDP
компонент, а также Инди, у которого есть TIdUDPClient
а также TIdUDPServer
компоненты. Или вы можете написать свой собственный код сокета UDP, используя WinSock API напрямую.
Indy также предоставляет Multicast
Адрес и хост 192.168.0.255
Это широковещательный IP-адрес для подсети IPv4 192.168.0.x с маской подсети 255.255.255.0. Если это фактическая конфигурация подсети, и ваш клиентский и серверный ПК оба подключены к подсети 192.168.0.x, то да, вы можете отправить широковещательное сообщение UDP на этот IP-адрес.
Чтобы получить широковещательный IP-адрес подсети, вы можете:
рассчитать это вручную. использование GetAdaptersInfo()
или же GetAdaptersAddresses()
чтобы получить текущий IPv4-адрес локального ПК и маску подсети, затем замаскируйте биты IP-адреса битами маски подсети, используя AND
оператор, а затем OR
результат с обратными битами маски сети.
спроси винду. Создать сокет и bind()
это к нужному локальному сетевому адаптеру. а затем использовать WSAIoctl(SIO_GET_BROADCAST_ADDRESS)
запросить широковещательный IP-адрес, связанный с этой сетью.
Других решений пока нет …