Добрый день, вопрос:
как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как получать ip удалённого конца, но до вызова accept()?
спасибо заранее.
> Добрый день, вопрос:
>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>получать ip удалённого конца, но до вызова accept()?
>спасибо заранее.inet_aton не подходит?
>> Добрый день, вопрос:
>>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>>получать ip удалённого конца, но до вызова accept()?
>>спасибо заранее.
>
>inet_aton не подходит?
к какому дескриптору применять inet_ntoa?
пример на пёрле из доки:# create socket $main_sock
# ...
$readable_handles->add($main_sock);
for(;;)
($new_readable) = IO::Select->select($readable_handles, undef, undef, 0);
foreach $sock (@$new_readable) {
if ($sock == $main_sock) {# как думается, здесь необходимо проверять ip клиента,
# если он валидный - аксептить, но как получить ip?
$new_sock = $sock->accept();
# ...
>>> Добрый день, вопрос:
>>>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>>>получать ip удалённого конца, но до вызова accept()?
>>>спасибо заранее.
>>
>>inet_aton не подходит?
>
>
>к какому дескриптору применять inet_ntoa?
>пример на пёрле из доки:
>
># create socket $main_sock
># ...
>$readable_handles->add($main_sock);
>for(;;)
> ($new_readable) = IO::Select->select($readable_handles, undef, undef, 0);
> foreach $sock (@$new_readable) {
> if ($sock == $main_sock)
>{
>
># как думается, здесь необходимо проверять ip клиента,
># если он валидный - аксептить, но как получить ip?
> $new_sock = $sock->accept();
># ...
Э.. Я про модуль Socket говорил.
> Добрый день, вопрос:
>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>получать ip удалённого конца, но до вызова accept()?
>спасибо заранее.
Если вопрос стоит пускать или не пускать подключение с определенного айпи, почему бы не воспользоваться iptables/ipchains ?
>> Добрый день, вопрос:
>>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>>получать ip удалённого конца, но до вызова accept()?
>>спасибо заранее.
>
>
>Если вопрос стоит пускать или не пускать подключение с определенного айпи, почему
>бы не воспользоваться iptables/ipchains ?
Так это привзяка к платформе и софту.
Я писал недавно сервер на tcp и спокойно фильтровал подключения по ИП. Только я предпочитаю работать с Socket, а не с IO::Socket в таких задачах.
>Я писал недавно сервер на tcp и спокойно фильтровал подключения по ИП.
>Только я предпочитаю работать с Socket, а не с IO::Socket в
>таких задачах.а можно чуть подробней, например:
use Socket;
socket(SERVER,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
setsockopt(SERVER,SOL_SOCKET,SO_REUSEADDR,1);
$addr=sockaddr_in($some_port,INADDR_ANY);
bind(SERVER,$addr) or die "can't bind: $!\n";
listen(SERVER,0) or die "can't listen: $!\n";
while (accept(CLIENT,SERVER))
{
#blahblahblah
}как мне в этом случае до accept'a определьть ip подключающегося?
или в принципе подход неверен?
>>Я писал недавно сервер на tcp и спокойно фильтровал подключения по ИП.
>>Только я предпочитаю работать с Socket, а не с IO::Socket в
>>таких задачах.
>
>а можно чуть подробней, например:
>
>use Socket;
>socket(SERVER,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
>setsockopt(SERVER,SOL_SOCKET,SO_REUSEADDR,1);
>$addr=sockaddr_in($some_port,INADDR_ANY);
>bind(SERVER,$addr) or die "can't bind: $!\n";
>listen(SERVER,0) or die "can't listen: $!\n";
>while (accept(CLIENT,SERVER))
>{
> #blahblahblah
>}
>
>как мне в этом случае до accept'a определьть ip подключающегося?
>или в принципе подход неверен?
Для примера приведу кусок из моего сервера:while(1) {
my($buffer);
next unless my $remote_addr=accept(SESSION,SOCK);
my($port,$hisaddr)=sockaddr_in($remote_addr);
## если IP нету в конфигах - отрубаем клиента
my $ip=inet_ntoa($hisaddr);
next if $ip ne 'Что нам нужно';
...
}
Здесь конечно не до accept'a идет отключение - но без акцепта - думаю никак, ведь сервер должен послать клиенту отказ -а для этого нужно установить accept.
Во всяком случае мой сервак раобтает без проблем и я его тестировал на перегруз - чисто - он отключает клиентов и не нагружает систему даже при большом кол-ве запросов.
>Для примера приведу кусок из моего сервера:
>
>while(1) {
>my($buffer);
>next unless my $remote_addr=accept(SESSION,SOCK);
>my($port,$hisaddr)=sockaddr_in($remote_addr);
>## если IP нету в конфигах - отрубаем клиента
>my $ip=inet_ntoa($hisaddr);
>next if $ip ne 'Что нам нужно';
>...
>}
>Здесь конечно не до accept'a идет отключение - но без акцепта -
>думаю никак, ведь сервер должен послать клиенту отказ -а для этого
>нужно установить accept.
>Во всяком случае мой сервак раобтает без проблем и я его тестировал
>на перегруз - чисто - он отключает клиентов и не нагружает
>систему даже при большом кол-ве запросов.спасибо, но здесь подключение всё-таки имеет место быть (и затем сразу отключение), а меня интересует посылка RST сразу после прихода SYN'а с неугодного ip, как если бы порт совсем не принимал подключения..