URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4070
[ Назад ]

Исходное сообщение
"tcp-сервер"

Отправлено Xander , 15-Мрт-05 12:50 
Добрый день, вопрос:
как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как получать ip удалённого конца, но до вызова accept()?
спасибо заранее.


Содержание

Сообщения в этом обсуждении
"tcp-сервер"
Отправлено PoizOn , 15-Мрт-05 15:32 
> Добрый день, вопрос:
>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>получать ip удалённого конца, но до вызова accept()?
>спасибо заранее.

inet_aton не подходит?



"tcp-сервер"
Отправлено Xander , 15-Мрт-05 16:26 
>> Добрый день, вопрос:
>>как на 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();
# ...


"tcp-сервер"
Отправлено PoizOn , 15-Мрт-05 16:43 
>>> Добрый день, вопрос:
>>>как на 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 говорил.

"tcp-сервер"
Отправлено mthawk , 17-Мрт-05 10:57 
> Добрый день, вопрос:
>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>получать ip удалённого конца, но до вызова accept()?
>спасибо заранее.


Если вопрос стоит пускать или не пускать подключение с определенного айпи, почему бы не воспользоваться iptables/ipchains ?


"tcp-сервер"
Отправлено PoizOn , 17-Мрт-05 11:04 
>> Добрый день, вопрос:
>>как на perl/C/C++ организовать для tcp-сервера фильтрацию подключений по ip, т.е. как
>>получать ip удалённого конца, но до вызова accept()?
>>спасибо заранее.
>
>
>Если вопрос стоит пускать или не пускать подключение с определенного айпи, почему
>бы не воспользоваться iptables/ipchains ?
Так это привзяка к платформе и софту.
Я писал недавно сервер на tcp и спокойно фильтровал подключения по ИП. Только я предпочитаю работать с Socket, а не с IO::Socket в таких задачах.



"tcp-сервер"
Отправлено Xander , 17-Мрт-05 15:32 
>Я писал недавно сервер на 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-сервер"
Отправлено PoizOn , 18-Мрт-05 13:56 
>>Я писал недавно сервер на 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.
Во всяком случае мой сервак раобтает без проблем и я его тестировал на перегруз - чисто - он отключает клиентов и не нагружает систему даже при большом кол-ве запросов.


"tcp-сервер"
Отправлено Xander , 18-Мрт-05 16:00 
>Для примера приведу кусок из моего сервера:
>
>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, как если бы порт совсем не принимал подключения..