Я хочу иметь возможность получать запрос на определенный порт только с локального хоста (оба из 127.0.0.1
а также my_local_ip
);
Я попробовал следующее:
int localhost = (127 << 24) + 1; // 127.0.0.1
sock_address.sin_addr.s_addr = htonl(localhost);
Это позволяет мне подключаться только с 127.0.0.1
но не из фактического местного ip.
Я также попробовал:
char hostName[128] = "";
struct hostent *pHost = 0;
gethostname(hostName, sizeof(hostName));
pHost = gethostbyname(hostName);
memcpy(&sock_address.sin_addr, pHost->h_addr_list[0], pHost->h_length);
К этому я не смог связаться с 127.0.0.1
Я смог подключиться с локальным ip, но на удаленные запросы тоже отвечали
Что я делаю неправильно? Есть ли другой путь?
Спасибо!
Из вашего приложения вы можете только установить, к каким интерфейсам будет привязан порт. В первом случае вы привязали его к интерфейсу обратной связи (lo
, Айпи адрес 127.0.0.1
) и это означает, что только вы можете подключиться к нему, потому что только ваш собственный хост достигает этого интерфейса. Если вы связываете порт с внешним интерфейсом, eth0
с IP-адресом 10.1.2.3
Например, внешние хосты могут подключаться к этому порту, если ни один брандмауэр не блокирует запрос на подключение.
Единственный способ сделать то, что вы хотите, это настроить фильтр пакетов (межсетевой экран) вашего локального компьютера, чтобы отклонять / отбрасывать запросы на соединение (пакеты SYN) на этот конкретный порт, поступающий с IP-адресов, которые не распознаются как ваши собственные. В этом случае удаленный хост будет думать, что ваш TCP-порт закрыт или заблокирован, в зависимости от того, как вы установите фильтр.
Ну … вы также можете принять любое соединение с любого интерфейса и немедленно закрыть его, если удаленный хост не является одним из ваших собственных IP-адресов, но по какой-то причине, я думаю, это то, что вы действительно хотите.
Других решений пока нет …