#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.