The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




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

  • tcp-сервер, !*! PoizOn, 15:32 , 15-Мрт-05 (1)
    • tcp-сервер, !*! Xander, 16:26 , 15-Мрт-05 (2)
      >> Добрый день, вопрос:
      >>как на 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-сервер, !*! mthawk, 10:57 , 17-Мрт-05 (4)
    • tcp-сервер, !*! PoizOn, 11:04 , 17-Мрт-05 (5)
      • tcp-сервер, !*! Xander, 15:32 , 17-Мрт-05 (6)
        >Я писал недавно сервер на 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, 13:56 , 18-Мрт-05 (7)
          • tcp-сервер, !*! Xander, 16:00 , 18-Мрт-05 (8)
            >Для примера приведу кусок из моего сервера:
            >
            >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, как если бы порт совсем не принимал подключения..




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру