На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Сокет , проблема с закачкой
      При закачки страницы рамблера или другой страницы, при вызове функци recv сохраняются непонятные символы в буфер, в чем может быть проблема ? :huh:

      Привожу отрывок из скаченного OutHTMLtext.txt / отметил красным /

      HTTP/1.1 200 OK
      Server: nginx/0.8.2
      Date: Sun, 12 Jul 2009 05:49:15 GMT
      Content-Type: text/html; charset=utf-8
      Transfer-Encoding: chunked
      Connection: close
      Set-Cookie: dv=gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:1247377755; path=/; expires=Thu, 31-Dec-37 23:55:55 GMT
      Set-Cookie: dvr=gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:1247377755; domain=.rambler.ru; path=/; expires=Thu, 31-Dec-37 23:55:55 GMT
      Set-Cookie: lv=1247377755; path=/; expires=Thu, 31-Dec-37 23:55:55 GMT
      Set-Cookie: lvr=1247377755; domain=.rambler.ru; path=/; expires=Thu, 31-Dec-37 23:55:55 GMT
      Expires: Sat, 11 Jul 2009 05:49:15 GMT
      Cache-Control: no-cache
      Set-Cookie: ruid=AQAAAFt5WUrZanY2AYYyCwB=; expires=Thu, 31-Dec-37 23:55:55 GMT; domain=.rambler.ru; path=/
      P3P: CP="NON DSP NID ADMa DEVa TAIa PSAa PSDa OUR IND UNI COM NAV"


      4e0d

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html><head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <meta http-equiv="X-XRDS-Location" content="http://id.rambler.ru/yadis.xml">
      <title>Rambler</title>
      <link rel="SHORTCUT ICON" href="http://www.rambler.ru/favicon.ico?ver=3">
      <link rel="search" href="http://www.rambler.ru/i/osd.xml" title="Rambler" type="application/opensearchdescription+xml">
      <link rel="alternate" type="application/rss+xml" title="Новости Рамблера" href="http://www.rambler.ru/doc/company_news/rss">
      <style type="text/css">
      html,body,table,th,td,form,fieldset,legend,dl,dt,dd,ul,ol,li,p,h2,h3,h4,h5,h6,.nm,.pgBlk .nm,.listProjects3 .all{text-align:left;vertical-align:top;list-style-type:none;padding:0;margin:0} html,body{min-height:100%} body,select,textarea{font-family:Arial,Verdana,sans-serif} body,h3 a,.pgSport .lnk u,.black,.black a,.black .lnk u,.pgLogIn .btm a,.pgLogOut .nick a,.pgRbc .lnk u,.pgPic b,.listProjects3 .all a{color:#333} body,.listProjects3 u{background:#FFF} body{font-size:101%} h1,.bone,.line,.cls,.pgCounters,.pgBanT{font-size:0;line-height:0} h2,th,.listMain b,.listMain2 b,.pgTV div b,.pgCurrency .down,.pgCurrency .up,.pgCurrency .th td,.pgTech h5,.pgHigh h5,.pgLenta h5,.pgTV2 div b{font-weight:normal} h4,.pgBg li,.listProjects,.listProjects2,.pgBanRT, .pgTop100 h4,.pgTV{margin-bottom:10px} h2,h2 a,.pgTop100 th,.pgFooter th,.pgTV2 div b{color:#656565} .pgBlk .date,.listProjects p,.pgTopLine table,.pgVote{font-size:70%} h3,.pgPic b{font-size:90%} .pgBanProject,.listMain b,.listMain2 b{font-size:85%} h2{background:url(/i/h2-bg.gif) no-repeat 0 6px;font-size:18px;text-transform:uppercase;padding-left:20px;margin-bottom:8px} .pgDating h3{margin-bottom:7px} h4{font-size:100%} h4,h5,.pgBg,.pgTraffic .counter,.pgBlk .date,.pgPic u,.pgRbc,.pgAfisha li,.pgAfisha h4{margin-bottom:5px} p,ul,.small,.pgPic,.pgLogIn,.pgLogOut dd,.pgCurrency table,.listProjects h5,.pgFooter table,h4,h5,.pgGames .btm td,.pgHoro td,.pgHoro2 td,.pgDating table,.listProjects3 table,.pgTech .title,.pgHigh .title,.pgLenta .title,.listAuto .all,.pgPriceMar8 .first,.pgPriceMar8 .second,.pgBanVibes1,.pgBanVibes2,.pgCurrencyCalc form,.pgFoto dl,.pgAudi table,.listNewsPromo th,.listNewsPromo td{font-size:80%} p.none{margin-bottom:0} label,.lnk{cursor:pointer} img{border-width:0} img.brdr,img.avtr,.avtr img{border:#9DB4BC solid 1px} a,.lnk u,u.lnk,.black .pgMore,.pgDate .time,.pgWeather .cold,.listMain2 .title1 span a,.listMain2 .title2 span a{color:#035178} a,.listProjects3 .lnk u,.listProjects3 .all a:hover,h2 a:hover,h4 a:hover,.lnk:hover,.lnk:hover u,.pgLogIn .btm a:hover,.pgLogIn .top

      .........

      1px} .pgBlk .listItems li{margin-top:7px} .listTop100 h2,.listTop100 h5{margin:0} .listTop100{width:100%} .listTop100 h2{float:left;margin-right:20px;} .listTop100 h5{padding-top:0.4em} .listTop100 li{width:9em;margin-right:15px;margin-bottom:7px} .listtop100 li a{white-space:nowrap} .listTop100 div{margin-top:9px} .listTop100 .all{margin-bottom:10px} .listTop100 .sep{margin:0 3px} .listStocks{margin-right:10px} .listStocks p{font-size:70%} .listStocks h5{margin-bottom:0} .listStocks .up{color:#00970B} .listProjects2 h5,.listProjects2 p{background:#FFF;padding-left:5px;margin:0} .listProjects2{padding:10px 0 0 10px} .listProjects2 div{background:url(/i/icos/projects.gif?3) no-repeat;padding:0 0 4px 30px;} .listProjects2 h5{font-size:70%;text-transform:uppercase} .listProjects2 p{color:#807E60;font-size:70%;padding-bottom:4px} .listProjects3{padding:10px 0 0 6px} .listProjects3 h2{background:none;padding-left:0;margin:0 0 10px 4px} .listProjects3 th{padding-right:7px} .listProjects3 u{padding:1px 0 8px 1px} .listProjects3 .lnk{background:url(/i/icos/projects3.gif) no-repeat;padding-left:25px} .listAuto .iS07{vertical-align:middle;margin-right:3px} .listAuto .all{font-size:70%;margin-bottom:7px} .listAuto .all u{color:#656565} .listNewsPromo th,.listNewsPromo td{padding:5px 0 8px 0} .listNewsPromo th{width:3%} .listNewsPromo th img{margin-right:10px;border:#BBCED4 solid 1px} .listNewsPromo td{width:30%} .listNewsPromo td a{margin-right:10px} #cityHeader{margin-bottom:5px} .b_eurovision_0014 .label,.b_rub_eurovision{color:#972AD8 !important} .colRgt .asurk-banner{padding:5px 0 0 0} .asurk-banner{padding:10px 0 10px 5px} .asurk-banner td{padding-left:10px}

      1


      e7f

      /***{/css/search.css?rv=900}***/ div.r--Search{margin:9px 0 0 0;background:#65CDF3 url(http://i.rl0.ru/search/rsearch_bg.gif) 0 0 repeat-x}div.r--Search a, .r--Search td{color:#fff;text-align:left}.r--Search table{border-collapse:collapse}.r--Search td{padding:0}.r--Search img{ border-width:0}.r--Search .r--LogoHolder{background-color:#FFF} .r--Search .r--urt{ background:transparent url(http://i.rl0.ru/search/rsearch_bg_tr.gif) 100% 0 no-repeat}.r--Search .r--urb{ background:transparent url(http://i.rl0.ru/search/rsearch_bg_br.gif) 100% 100% no-repeat}.r--Search table{width:100%;height:82px;background-position:90px 0;background-repeat:no-repeat}.r--Search h1{ font-size:0 !important;line-height:0 !important;padding:0 !important;margin:0 !important} .r--SearchMenu{white-space:nowrap;font-size:80%}.r--SearchMenu a{font-weight:bold;text-decoration:none;display:block;padding:7px 8px;float:left}.r--SearchMenu a:hover{color:#FFF;text-decoration:underline}.r--SearchMenu a.r--active{color:#000;background-color:#81C5E8}.r--SearchMenu a.r--active:hover{color:#000}.r--SearchText{width:100%;background-color:#fff;padding-left:2px}td.r--SearchSelect{padding-left:15px}.r--SearchSelect select{width:100%;background-color:#fff}td.r--SearchExm{width:70%;white-space:nowrap;font-size:70%;padding:7px 10px 8px 0;vertical-align:middle;color:#333}td.r--SearchExm a{border-bottom:1px #333 dashed;text-decoration:none;color:#333}td.r--SearchExm a:hover{text-decoration:none}.r--SearchAdv{width:30%;vertical-align:middle;font-size:70%}.r--SearchAdv a{white-space:nowrap;float:right;text-decoration:underline}.r--SearchAdv a:hover{text-decoration:none}.r--homepage{font-size:70%;text-decoration:underline}.r--homepage:hover{text-decoration:none}.r--moreLayer{background:#3CADE1;position:absolute;margin-top:0.55em;border:1px #A2D8F1 solid;border-top:0px;margin-left:-9px}.r--Search .toSubMenu{cursor:pointer;font-weight:bold;position:relative;margin-left:2px}.r--Search .r--moreLayer{font-weight:normal}.r--Search .r--moreLayer a{color:#fff;float:none;padding:5px 10px}.r--Search .r--moreLayer a:hover{/* text-decoration:underline;*/}.r--Search .toSubMenu img.more{ position:relative;background:transparent url(http://i.rl0.ru/search/arrow.gif) no-repeat 0 3px;width:11px;height:10px;margin:2px 0 0 3px;vertical-align:top}.r--friendsRLogo,.r--friendsRLogoIE{ width:133px;height:57px;margin:25px 5px 0px 0}.r--friendsLogoBg{background:url(http://i.rl0.ru/search/bglogo_friends.jpg)}.r--friendsLogo{background:url(http://i.rl0.ru/search/logo_friends.gif) no-repeat;display:block;position:absolute;width:101px;height:105px;margin-top:-14px}.r--friendsRLogo{background:url(http://i.rl0.ru/search/rlogo_friends.png) no-repeat}.r--friendsRLogoIE{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://i.rl0.ru/search/rlogo_friends.png', sizingMethod='scale')}.suggest, .suggest a{ color:#000}.suggest{position:absolute;border-right:1px solid #969696;border-bottom:1px solid #969696;border-top:1px solid #eaf6fd;border-left:1px solid #eaf6fd;background:#fff url(http://nova.rambler.ru/images/wrapper/suggest-gr-bg.gif) repeat-x top;z-index:100;width:400px !important}.suggest ul{list-style-type:none;margin:5px 0px;padding:0px;text-align:left}.suggest ul li{ padding:2px 5px;cursor:pointer;position:relative}.suggest ul li.select{background:#e1eaf0}.suggest ul li.over{color:#F00;text-decoration:underline}.suggest div.close{ text-align:right;padding:3px 5px !important;background:#2da1da}.suggest div.close a{ font-size:11px;color:#fff;padding-right:12px;background:url(http://nova.rambler.ru/images/wrapper/suggest-close.gif) right 5px no-repeat}.suggest div.close a:hover{ text-decoration:none} /***{end}***/

      5d2

      </style>
      <!--[if IE]><style type="text/css">
      html,body{height:100%} body{font-size:100%;filter:expression(document.execCommand("BackgroundImageCache", false, true))} h3 span{margin-top:2px} li,.listProjects2 h5{line-height:1.2em} a.lnk{border:#FFF solid 0px} a.lnk:hover{border:#000 solid 0px} .colRgt{width:190px} .pgLogOut p,.pgWeather h5,.pgWeather p,.pgRadio a,.pgTraffic a,.pgTraffic .counter,.listProjects3 .lnk,.pgLogOut2 .nick a,.pgLogOut2 .exit a,.pgLogOut2 .full{position:relative}
      ..........

      Сам код

      ExpandedWrap disabled
        char *ServGet="GET / HTTP/1.1\r\nHost: www.rambler.ru\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0)\r\nAccept: text/html\r\nConnection: close\r\n\r\n";
        HANDLE hFile;
        DWORD _br;
        WSADATA wsa_data;
        SOCKET s;
        sockaddr_in addr
        hostent* hn;
        int len;
        char bufLoad[1492];
         
        WSAStartup(0x0202,&wsa_data);
        s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        hn=gethostbyname("www.rambler.ru");
        addr.sin_family=AF_INET;
        addr.sin_port=htons(80);
        addr.sin_addr.S_un.S_addr=*(DWORD*)hn->h_addr_list[0];
        bind(s,(LPSOCKADDR)&addr,sizeof(addr));
        connect(s,(LPSOCKADDR)&addr,sizeof(addr));
        send(s, ServGet, lstrlen(ServGet), 0);
         
        hFile=CreateFile("OutHTMLtext.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        do {
        len = recv(s,bufLoad,1492, 0);
        WriteFile(hFile,&bufLoad,len,&_br,NULL);
         
        RtlZeroMemory(bufUpLoad,1492);
        if (len>0){
        //....
        }
        else if (len==0){
        //....
        }
        else{
        //....
        }
        } while(len>0);
        CloseHandle(hFile);
         
        closesocket(s);
        WSACleanup();

      Прикреплённый файлПрикреплённый файлOutHTMLtext.zip (29.16 Кбайт, скачиваний: 191)
        Transfer-Encoding: chunked
        Красные буквы - это размер чанка(порции)в 16 системе
          Цитата Oleg2004 @
          Transfer-Encoding: chunked
          Красные буквы - это размер чанка(порции)в 16 системе

          Как их можно запретить или почистить ?
            Можно попробовать использовать http 1.0
            Иначе нужно читать данные по чанкам.
            Сообщение отредактировано: Jenya -
              Цитата Jenya @
              Можно попробовать использовать http 1.0
              Иначе нужно читать данные по чанкам.

              Угу я это вчера реализовал. :yes:

              Вопрос к Oleg2004 специалисту сетевых технологий :)

              1) Какой должен быть стандартный размер буфера для recv, елси MTU 1492 ?
              2) Как грамотно удалять из буфера шапку отправленную сервером, и по возможности считывать ?
              3) HTTP1.0 и HTTP1.1 есть ли разница ? Если я буду использовать HTTP1.0, будет ли сервер ограничивать в чем нибудь ?
              Сообщение отредактировано: Transformer-V -
                Из новведений http 1.1 можно отметить поддержку компрессии gzip.

                Как по мне лучше сначала прочитать шапку с помощью recv с флагом MSG_PEEK, определив её конец по /r/n/r/n, прочитать её обычным recv, а потом уже читать данные.

                Я обычно беру размер буфера равный размеру страницы памяти.
                  Цитата Transformer-V @
                  Какой должен быть стандартный размер буфера для recv, елси MTU 1492 ?

                  Думаю надо делать 1500 байт больше быть все равно не может.
                    Цитата Urich @
                    ..надо делать 1500 байт больше быть все равно не может.

                    это рекомендованный размер. а IP пакет максимальный 65535 байт. по умолчанию комуникационное оборудование режет до 1500. Но это не догма. Можно отправить(и принять) и бОльший кусок. Если убрать "слабые звенья" по пути. Форточки по умолчанию так же режут на 1500, но боюсь это программнозависимая величина.


                    удачи Вам
                    (круглый)
                      Jenya Urich kolobok0
                      Спасибо за ответы :)

                      Чтоб резать шапку написал следующий алгоритм, :rolleyes: оцените ..... на качество :)

                      ExpandedWrap disabled
                        char BuferDow[1000000]; // Тут находится некий сайт скаченный
                        char buf1[200000];      // Буфер на выход с шапкой
                        char buf2[200000];      // Буфер на выход с HTML содержимым
                        int a,b,c;
                        bool zatvor=false;
                         
                        a=0;
                        b=lstrlen(BuferDow);
                        c=0;
                         
                         
                         
                         
                        for (a=0;a<b;a++)
                        {
                        if ((zatvor==false)&&(BuferDow[a]==0x0d)&&(BuferDow[a+1]==0x0a)&&(BuferDow[a+2]==0x0d)&&(BuferDow[a+3]==0x0a))
                        {
                        zatvor=true;
                        buf1[a]=0x00;
                        a=a+4;
                        }
                        switch (zatvor)
                        {
                        case true:
                        buf2[c]=BuferDow[a];
                        c++;
                        break;
                        case false:
                        buf1[a]=BuferDow[a];
                        break;
                        }
                        }
                        buf2[c]=0x00;
                         
                         
                        MessageBox(0,buf1,"Шапка",32);
                        MessageBox(0,buf2,"HTML код",32);


                      Обсуждение этого кода в другом разделе http://forum.sources.ru/index.php?act=ST&f=74&t=276874&st=0
                      Сообщение отредактировано: Transformer-V -
                        Цитата kolobok0 @
                        Форточки по умолчанию так же режут на 1500, но боюсь это программнозависимая величина.

                        К сожалению нет. Это аппаратная величина сетевого фрейма для эзернета, в которую входит IP Head + Data.

                        Добавлено
                        Другое дело что делать буфер = MTU нет смысла, если только вы не програмите драйвера или что то в этом роде.:) Между сетью и софтом есть программный буфер в котором все пакеты собираются в последовательность данных.

                        Цитата
                        В компьютерных сетях термин Maximum Transmission Unit (MTU) используется для определения максимального размера блока (в байтах), который может быть передан на канальном уровне коммуникационного протокола.

                        Значения MTU зависят от коммуникационного интерфейса (Сетевая плата, последовательный порт, и т. д.).

                        Цитата
                        Internet Path MTU (RFC 879) 576
                        Ethernet (RFC 1191) 1500
                        802.3 (RFC 1191) 1492
                        802.11[1] 2272
                        802.5 4464
                        FDDI (RFC 1191) 4500
                        Сообщение отредактировано: Urich -
                          Цитата Urich @
                          ..К сожалению нет. Это аппаратная величина сетевого фрейма для эзернета, в которую входит IP Head + Data...Между сетью и софтом есть программный буфер в котором все пакеты собираются в последовательность данных.

                          по IP протоколу для указания длины одного кванта данных на данном уровне используется ДВА байта. Это по СТАНДАРТУ. Я могу Вам сформировать пакет в 65535 байт (IP) и послать на Ваш комп. Если по пути следования нет ограничений (и не стоит флаг запрета дефрагментации его) - то его разрежут по дороге. Если кабель непосредственно воткнуть в форточки то получим все те жи 1500.

                          Если стоит флаг - то зависит от выделенных буферов на IP уровне и их занятости.

                          Это простите из опыта.
                          Ось тут не причём (это к мысли про дрова).

                          Собственно процитирую RFC (уровень IP):

                          Total Length: 16 bits

                          Total Length is the length of the datagram, measured in octets,
                          including internet header and data. This field allows the length of
                          a datagram to be up to 65,535 octets. Such long datagrams are
                          impractical for most hosts and networks. All hosts must be prepared
                          to accept datagrams of up to 576 octets (whether they arrive whole
                          or in fragments). It is recommended that hosts only send datagrams
                          larger than 576 octets if they have assurance that the destination
                          is prepared to accept the larger datagrams.


                          удачи Вам
                          (круглый)
                          ЗЫ
                          На TCP слое есть своя сборка ышо :)

                          -Added
                          Цитата Transformer-V @
                          ..Чтоб резать шапку написал следующий алгоритм..

                          лично мне не совсем нравится глазу цикл for для такой мелкой задачи.
                          Т.к. приходит строка, то напрашивается резка стандартными сишными функциями.
                          Типа поиска подстроки...


                          ЗЫ
                          По поводу свитча над булем (простите вспомнилось, улыбнуло) - вспомнился код (говорят от индусов)

                          типа того:
                          ExpandedWrap disabled
                            bool Foo()
                            {
                            bool blRet = true;
                             
                            //   бла-бла-бла
                             
                            if (blRet == true)
                              return true;
                            if (blRet == false)
                              return false;
                            if ((blRet != true) && (blRet != false))
                              return !blRet;
                            return false;
                            }


                          приминительно к вашему коду - свитч эффективен на перемнных (обычно) принимающих более двух значений. свитч (лучше всего) должен содержать секцию default. данную логику можно разместить (вроде ничему не противоречит) внутри ифа - и выкинуть вообще переменную затвор (попахивает чем то военным) :) . В логику не вдавался - простите.
                            Цитата kolobok0 @
                            На TCP слое есть своя сборка ышо

                            Ну это я и имел ввиду под буфером ОС.
                              Цитата Urich @
                              ..Ну это я и имел ввиду под буфером ОС.

                              а там уже своя игра. Есть понятие окна. Его длина подбирается в зависимости от условий прохождения пакетов до удалённого адреса и обратно, а так же от текущего состояния TCP слоя. Т.е. как правило на формирование буфера на более высокий уровень (программы) очень сильно влияет выставленная задержка (желательно её сбрасывать в ноль, если надо шустрый обмен) на передачу самого сформированного потока и собственно качество линии. Это мона сказать основное. Понятно, что размер буфера при этом может быть разным. Самое главное наверное - чтоб он не душил TCP уровень.

                              Обычно делается квантование на стороне передатчика. На стороне приёмника обычно подгоняют буфер не меньший чем длина самого большого кванта. Правда тут кроются одни из частых граблей - почему то часто забывают что данные поточны а не диаграммны.

                              Что касается работа с серваком HTTP то наверное стоит буффер выделять не меньше чем сама WEB страница. Дабы чтоб сервак меньше нагружать сессией (как мне кается).

                              с уважением
                              (круглый)
                                Размер системного (модуля TCP) буфера для каждого отдельного сокета устанавливается операционкой
                                Для Виндозы это в районе 8кб (где-то были такие цифры, сейчас точно сказать не могу, так как в Испании :D )
                                При ручном(программном) управлении системным буфером сокета setsockopt() рекомендуется устанавливать кратно 2,4,8 и тд MTU
                                Буфер сокета модуля TCP оказывается способным принять сразу несколько Езернет-фреймов с IP-пакетами, хотя может принять и только один байт (все зависит от сети и момента переключения системы на поток управления TCP )

                                Цитата Urich @
                                Между сетью и софтом есть программный буфер в котором все пакеты собираются в последовательность данных.

                                Здесь все должны четко помнить и понимать - на данном компе есть по крайней мере 4 буфера - буфер карты(физический)
                                Буфер драйвера карты(программный)
                                Буфер модуля стека (например буфер сокета TCP)
                                Ну и буфер функции приложения - отправки или приема.
                                  Цитата Oleg2004 @
                                  Размер системного (модуля TCP) буфера для каждого отдельного сокета устанавливается операционкой
                                  Для Виндозы это в районе 8кб (где-то были такие цифры, сейчас точно сказать не могу, так как в Испании :D )
                                  При ручном(программном) управлении системным буфером сокета setsockopt() рекомендуется устанавливать кратно 2,4,8 и тд MTU
                                  Буфер сокета модуля TCP оказывается способным принять сразу несколько Езернет-фреймов с IP-пакетами, хотя может принять и только один байт (все зависит от сети и момента переключения системы на поток управления TCP )

                                  Цитата Urich @
                                  Между сетью и софтом есть программный буфер в котором все пакеты собираются в последовательность данных.

                                  Здесь все должны четко помнить и понимать - на данном компе есть по крайней мере 4 буфера - буфер карты(физический)
                                  Буфер драйвера карты(программный)
                                  Буфер модуля стека (например буфер сокета TCP)
                                  Ну и буфер функции приложения - отправки или приема.

                                  Угу спасибо большое :)
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0556 ]   [ 16 queries used ]   [ Generated: 27.04.24, 14:25 GMT ]