Как привязать TServerSocket к определенному IP-адресу

#delphi #ip-address #serversocket

#delphi #ip-адрес #serversocket

Вопрос:

Кто-нибудь знает какой-либо способ привязать компонент TServerSocket Delphi для приема запросов только по определенному локальному адресу?

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

Ответ №1:

TServerSocket напрямую не предоставляет запрашиваемую вами функцию, однако это выполнимо с небольшим обходным путем.

Вам необходимо получить новый класс TServerSocket , чтобы получить доступ к защищенному TAbstractSocket.Address свойству. Это значение, к которому TServerSocket привязывается. Поскольку свойство обычно недоступно, оно остается пустой строкой, которая совпадает с привязкой к 0.0.0.0 (иначе INADDR_ANY говоря, ко всем локальным IP-адресам).

Как только вы сможете получить доступ к Address свойству, вы можете установить для него любой IP-адрес, который вы хотите, до активации сервера, и сервер будет привязан соответствующим образом.

Например:

 type
  TServerSocketAccess = class(TServerSocket)
  end;

TServerSocketAccess(ServerSocket1).Address := '192.168.0.1';
ServerSocket1.Active := True;
  

Комментарии:

1. Большое спасибо, Реми. Этот код успешно обновляет значение адреса сокета сервера. Однако серверное приложение продолжает отвечать на все другие IP-адреса даже после того, как свойство address явно установлено на IP. У вас есть какие-либо идеи, почему? Это ограничение сокета Delphi?

2. @LastManStanding то, что вы описываете, может произойти только тогда, когда значение Address пусто во время активации сервера. Прослушивающий сокет привязывается к любому заданному IP-адресу и может принимать соединения только по этому IP. Привязка к пробелу Address позволяет подключаться к любому IP. Вы должны установить Address перед установкой Active true.