PurpleI2P / i2pd

🛡 I2P: End-to-End encrypted and anonymous Internet
https://i2pd.website
BSD 3-Clause "New" or "Revised" License
3.26k stars 423 forks source link

Поддержка Windows (компилятор vs2013) #5

Closed chertov closed 7 years ago

chertov commented 10 years ago

Собрал исходники с помощью Visual Studio 2013. Вроде бы компилируется, запускается, но есть проблемы. При первом запуске создает два файла router.info и router.keys (в них какая-то каша). Виндовский фаервол спросил разрешить или нет, видимо сервер открыл порт. Пишет такой лог:

netDb doesn't exist
Start listening port 17007
Creating zero hops inbound tunnel...
I2NP msg received len=545, type=23, msgID=0
VariableTunnelBuild
VariableTunnelBuild 1 records
Record 0 is ours
TransitTunnel gateway: 1736841068 created
I2NP msg received len=545, type=23, msgID=555
VariableTunnelBuild
VariableTunnelBuild 1 records
VariableTunnelBuild reply for tunnel 1847386387
TunnelBuildResponse 1 records.
Ret code=0
Inbound tunnel 1847386387 has been created
I2NP msg received len=545, type=23, msgID=1
VariableTunnelBuild
VariableTunnelBuild 1 records
Record 0 is ours
TransitTunnel endp

и падает в void Tunnel::Build (uint32_t replyMsgID, OutboundTunnel * outboundTunnel) в этой точке:

EncryptBuildRequestRecord (*hop->router,
    CreateBuildRequestRecord (hop->router->GetIdentHash (),
...

При последующих запусках не может распарсить router.info и соответственно вылетает.

При компиляции был собран boost 1.55 и crypto++ 5.6.2 и возникли следующие проблемы: 1) Компилятор vs2013 пока не умеет спецификаторы default, но, к счастью, их всего несколько. В коде эти конструкторы не использовались, поэтому большую часть просто закомментил (классы IdentHash и RouterInfo).

2) В винде нету endian.h, использовал такую версию https://gist.github.com/panzi/6856583

3) тип ssize_t отсутствует, не разбирался пока, просто убрал одну s)

4) Отсутствует gmtime_r. Пока оставил так:

#ifdef _WIN32
        gmtime_s(&tm, &t);
#else
        gmtime_r(&t, &tm);
#endif

5) функция sleep в винде начинается с заглавной буквы Sleep

Под линуксом не собирал, думаю стоит поставить линукс и искать 10 отличий) Очень бы хотелось иметь кросплатформенные исходники и собирать проект родным компилятором под виндой.

mikhail4021 commented 10 years ago
bool DL_GroupParameters_IntegerBased::ValidateElement(unsigned int level, const Integer &g, const DL_FixedBasePrecomputation<Integer> *gpc) const
{

const Integer &p = GetModulus(), &q = GetSubgroupOrder();

bool pass = true;
 ===> pass = pass && GetFieldType() == 1 ? g.IsPositive() : g.NotNegative();
pass = pass && g < p && !IsIdentity(g);

это кусок из CRYPT, после которого все падает. Вызывается в class DL_PublicKeyImpl:

bool Validate(RandomNumberGenerator &rng, unsigned int level) const
{
    bool pass = GetAbstractGroupParameters().Validate(rng, level);
    pass = pass && GetAbstractGroupParameters().ValidateElement(level, this->GetPublicElement(), &GetPublicPrecomputation());
    return pass;
}

почему так, пока не понял

mikhail4021 commented 10 years ago

===> pass = pass && GetFieldType() == 1 ? g.IsPositive() : g.NotNegative();

в этот момент pass становится false

orignal commented 10 years ago

Похоже я знаю в чем дело: скорее всего коструктор переменной i2p::data::context вызывается раньше чем инициализируются константы из CryptoConst.h

UPD: Починил

chertov commented 10 years ago

сейчас попробую пересобрать...

chertov commented 10 years ago

В консоль пишет signature verification failed, вылетает тут

    //! throws InvalidMaterial if this object fails Validate() test
    virtual void ThrowIfInvalid(RandomNumberGenerator &rng, unsigned int level) const
===>    {if (!Validate(rng, level)) throw InvalidMaterial("CryptoMaterial: this object contains invalid values");}

при чтении netDb\r0\routerInfo-0HRiZlDcB2eegk6sA0oreq3xQJSpoJacLmb141ROwfE=.dat

и как и раньше при последующих запусках

// когда читает router.info  в   void RouterInfo::ReadFromFile (const char * filename)
// выкидывает 
/// Run-Time Check Failure #2 - Stack around the variable 'value' was corrupted.
void RouterInfo::ReadFromStream (std::istream& s)
{
...
// тут в конце 
===>  }
orignal commented 10 years ago

Удалите router.info и router.keys и запустите по новой. Это по поводу неверной подписи.

По второму вопросу что там с чтением из файла буду смотреть.

chertov commented 10 years ago

пробовал, вылетает... думаю пока линукс не поставлю и не сравню с ним трудно будет поймать...

chertov commented 10 years ago

кажется нашел... ноут правда повис)

помню спотыкался о нечто похожее... в винде приходилось явно указывать что читать файл нужно бинарным, а в древнем военном линуксе работало нормально

в RouterInfo.cpp, 44 строка

std::ifstream s(filename);
std::ifstream s(filename, std::ios::binary);
orignal commented 10 years ago

Да конечно так оно и есть, в юниксах же нет этого дурацкого \r\n. pull request сделайте

chertov commented 10 years ago

у меня скомпилился, запустился, повис и даже процесс не убивается) ушел на ребут

сейчас подготовлю

orignal commented 10 years ago

Я ж говорю наверное на условных переменных как надо не засыпает. Это смотреть и разбираться надо какой именно поток такую гадость делает.

chertov commented 10 years ago

перезапускал, когда грузит файлы из netDb, то вываливается Stack around the variable 'value' was corrupted и еще какой-то переменной...

попробуй в main все закомментить и смотреть что не так по проядку... как ловить эти условные переменные сейчас смутно представляю)

chertov commented 10 years ago

есть кусок кода в void RouterInfo::ReadFromStream (std::istream& s)

char key[50], value[50];
r += ReadString (key, s);
s.seekg (1, std::ios_base::cur); r++; // =
r += ReadString (value, s); 
s.seekg (1, std::ios_base::cur); r++; // ;

использует функцию ReadString

    size_t RouterInfo::ReadString (char * str, std::istream& s)
    {
        uint8_t len;
        s.read ((char *)&len, 1);
        s.read (str, len);
        str[len] = 0;
        return len+1;
    }   

значение переменной len в дебаггере бывает достигает 86, какой-то длинный идентификатор версии, номера билда/сборки что ли...

orignal commented 10 years ago

Спасибо за находку. Поправлю. Еще, если вас не затруднит, загляните внутрь самого файла что именно это.

chertov commented 10 years ago

странно выглядит... файл router.info str получается "caps=LR; coreVersion=0.9.8.1;netId=2;router.version=0.9.8.1; start_uptime=90m;" значение len=86

также проскакивают в этом же файле значения len 204... строка аналогичного вида

chertov commented 10 years ago

тупо увеличил везде буфферы до 500 вместо 50-ти...

//char key[50], value[50];
char key[500], value[500];

и оно начало работать)

248 routers loaded
Start listening port 17007
Creating zero hops inbound tunnel...
I2NP msg received len=545, type=23, msgID=0
VariableTunnelBuild
VariableTunnelBuild 1 records
Record 0 is ours
TransitTunnel gateway: 3700403565 created
I2NP msg received len=4370, type=23, msgID=555
VariableTunnelBuild
VariableTunnelBuild 1 records
VariableTunnelBuild reply for tunnel 575107807
TunnelBuildResponse 1 records.
Ret code=0
Inbound tunnel 575107807 has been created
I2NP msg received len=545, type=23, msgID=16777216
VariableTunnelBuild
VariableTunnelBuild 1 records
Record 0 is ours
TransitTunnel endpoint: 3807760356 created
TunnelGateway
TunnelGateway of 4625 bytes for tunnel 1840091100
Tunnel 1840091100 not found
Creating one hop outbound tunnel...
Connecting to 78.201.20.194:27989
Connected
Phase 1 sent: 288
Phase 2 received: 304
Phase 3 sent: 448
Phase 4 received: 48
NTCP session connected
Msg sent: 16
Msg sent: 656
Msg sent: 560
Pending tunnel build request 555 has not been responded. Deleted

на этом вылетело... вот тут:

            ~TunnelConfig ()
            {
                TunnelHopConfig * hop = m_FirstHop;

                while (hop)
                {
                    delete hop;
    ====>           hop = hop->next;
                }   
            }
orignal commented 10 years ago

По поводу строки в RouterInfo: там вообще то перед каждым полем идет 1 байт с длиной строки, который и чиатается в переменную len. 86 это код символа 'V' - явно где то все съехало, возможно из-за как раз лишнего символа конца строки в windows. На самом деле там сначала идут 2 байта длины всех эти свойств, а далеше уже поля, и похоже они где то потерялись.

chertov commented 10 years ago

да, чувствуется... там в дебаггере в строке видны квадратики, сразу показалось что он их разбить не смог перед этим 86 len было равно 0... ищу нестыковки...

                     delete hop;
====>           hop = hop->next;

стабильно падает... а так уже видел в браузере 7070 сервер, циферки и адрес флибусты! хотелось бы ее сегодня увидеть)

orignal commented 10 years ago

Там где падает это явная "детская" ошибка :) Уже починил. Перекомпилируйте.

chertov commented 10 years ago

Ну и отлично! Работает не падает) набирает на 7070 какие-то айпишники, на флибусте пока пишет LeaseSet not found также пишет ошибки Read error: и Connect error:, текст квакозябрами... как вернуть нормальный кажется знаю

Долго он по времени может флибусту не открывать?

orignal commented 10 years ago

Вы свой внешний IP прописали? А то у вас тоннели не будут создаваться по причине того что соседи не будут знать как до вас достучаться. Смотрите что в консоли пишет - должно быть много "New RouterInfo added" потому что у вас сейчас сетевая база маленькая и будут постоянно обнаруживаться неизвестные узлы. Флибусту он откроет когда найдет ее LeaseSet, а найдет он ее тогда когда обратится к floodfill-у, который про нее знает. Вообщем надо терпеливо запрашивать эту страницу. Когда найдет LeaseSet, то станет посылать запрос в тоннели, через несколько попыток дело закончится успехом и придет страница. У меня примерно минуты через две после старта все получается, но у меня узлов много в базе.

chertov commented 10 years ago

В консоль пишет иногда Phase 1 sent: 288 Phase 2 read error: End of file. Wrong ident assumed

NTCP session terminated

3 routers deleted

А куда и как ip правильно прописать нужно и какой порт указать? Пробросить через роутер смогу...

Только что упало вот тут:

        while (hop)
        {
            EncryptBuildRequestRecord (*hop->router,
                CreateBuildRequestRecord (hop->router->GetIdentHash (), 
                    hop->tunnelID,
                    hop->nextRouter->GetIdentHash (), 
                    hop->nextTunnelID,
                    hop->layerKey, hop->ivKey,                  
                    hop->replyKey, hop->replyIV,
                    hop->next ? rnd.GenerateWord32 () : replyMsgID, // we set replyMsgID for last hop only
                    hop->isGateway, hop->isEndpoint), 
        ===>        records[i]);
            i++;
            hop = hop->next;
        }   

сообщение прочесть не успел...

orignal commented 10 years ago

То что та сторона дает отлуп после первого сообщения скорее всего означает что этот узел устарел и на том IP уже сидит другой I2P адрес.Я такие узлы удаляю из базы - со временем все приходит в норму и большинство узлов становятся живыми. Надо в main первой строчкой написать i2p::context.OverrideNTCPAddress (<внешний IP>, <порт>); IP адрес который у вас на роутере снаружи, порт можете выбрать любой, естественно пробрасываете его.

Почему там упало посмотрю, на первый взгляд опять выход за пределы диапазона.

chertov commented 10 years ago

Так, порты пробрасывал, но все равно не подключалось... зато нашел баги с загрузкой файлов

m_Timestamp = be64toh (m_Timestamp);

be64toh не преобразовывала нормально, версию endian.h с хабра заменил на ту что нашел (в первом сообщении топика ссылка)

chertov commented 10 years ago

Также после долгой работы вылетела в NetDb.cpp, void NetDb::HandleDatabaseSearchReplyMsg (I2NPMessage * msg) вот тут:

            else
            {
                // no more requests for detination possible. delete it
                m_RequestedDestinations.erase (it);
    ===>        delete it->second;
            }   
orignal commented 10 years ago

Что значит не подключилась? С другими узлами соединяется? Тоннели создаются? Сообщения какие нибудь приходят?

chertov commented 10 years ago

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

orignal commented 10 years ago

Так на флибусту сразу зайти и не получится. Сначала посмотрите насколько у вас увеличилось количество узлов в директории netDb. Когда их станет достаточно много после очередной попытки зайти на флибусту вы увидите сообщение вроде этого LesetSet num=5. Потом уже будет быстро.

chertov commented 10 years ago

под линуксом скомпилил на сервере... пришлось добавить в Makefile -lpthread в LDFLAGS, пробросил порт на винду и смотрел что там на 7070... флибуста открылась! под линуксом падает (выкидывает Segmentation fault), запустил под дебагером, но под дебагером падать не хочет)

На винде работает, но роутеры новые не добавляет... ip у меня серый, не доступен из инета... флибусту посмотреть не получается

orignal commented 10 years ago

Насчет Segmentation fault разершите создание core файлов командой ulimit -c unlimited. Когда грохнется снова то создастся файл core, потом его gdb i2p core и внутри команда where и будет понятно где. Я знаю что иногда грохается - не было времени посмотреть.

С серым IP в приниципе это не помеха, вы можете завести себе ipv6 адрес через тоннель, разумеется придется в нескольких местах поправить но принципиально ничего не поменяется. Сам этим еще не занимался потому что есть белый IP.

chertov commented 10 years ago

Пробросил порт, работает! находит новые роутеры и добавляет, но есть две проблемы:

1) видимо он сохраняет в netDb новые файлы... и сохраняются они криво, скорее всего опять с std::ios::binary что-то связано. При повторном запуске он не может их прочитать, пишет signature verification failed. Постараюсь пофиксить.

2) Во время работы с чистой netDb находит роутеры, подключается, но падает в нескольких местах... в NetDb.cpp

        if (it != m_RequestedDestinations.end ())
        {   
            m_RequestedDestinations.erase (it);
478 ===>    delete it->second;
        }   

и в Garlic.cpp

        if (it != m_Sessions.end ())
        {
            m_Sessions.erase (it);
240 ===>        delete it->second;
        }
        GarlicRoutingSession * session = new GarlicRoutingSession (destination, 0); // not follow-on messages expected
orignal commented 10 years ago
  1. Да он сохранят новые и удаляет недоступные/устаревшие раз в минуту
  2. Действительно так делать нельзя, после вызова erase итератор может показывать на что угодно, в линуксе видимо std::map реализован иначе. Поправлю.
chertov commented 10 years ago

Флибуста открылась под виндой!) orignal, спасибо за прекрасную работу!

Починил баг с сохранением файлов в NetDB, там std::ofstream::binary мешал. Добавил вывод в консоли русских символов. Ошибки на русском теперь нормально пишет. Работает уже минут 30, не падает! Загрузка процессора очень маленькая, памяти есть 5.5мб. Заметил что при обновлении 127.0.0.1:7070 страничка обновляется с существенной задержкой. Главная страница со статистикой подвисает секунд на 5, иногда обновляется мгновенно. При этом в консоли активно выводится лог, нет ощущения что приложение тормозит, может отдельный поток чего-то ждет...

orignal commented 10 years ago

Странно я у себя такого не замечал. На главной странице нечего ждать - там просто тупой проход несколькими итераторами.

P.S: Понял в чем дело: у вас там скорее всего еще где то запрос к Флибусте висит, там в запросе надо не подвешивать весь поток, а ждать асинхронно.

chertov commented 10 years ago

после нескольких часов работы вылетел... вот колл стек:


    i2pd.exe!boost::asio::detail::win_iocp_socket_service_base::interlocked_compare_exchange_pointer(void * * dest, void * exch, void * cmp) Line 632
    i2pd.exe!boost::asio::detail::win_iocp_socket_service_base::close(boost::asio::detail::win_iocp_socket_service_base::base_implementation_type & impl, boost::system::error_code & ec) Line 176
    i2pd.exe!boost::asio::stream_socket_service<boost::asio::ip::tcp>::close(boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::implementation_type & impl, boost::system::error_code & ec) Line 170
    i2pd.exe!boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >::close() Line 357
    i2pd.exe!i2p::ntcp::NTCPSession::Terminate() Line 53
    i2pd.exe!i2p::ntcp::NTCPSession::HandleReceived(const boost::system::error_code & ecode, unsigned int bytes_transferred) Line 370
    i2pd.exe!boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>::operator()(i2p::ntcp::NTCPSession * p, const boost::system::error_code & a1, unsigned int a2) Line 280
    i2pd.exe!boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> >::operator()<boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list2<boost::system::error_code const &,unsigned int const &> >(boost::_bi::type<void> __formal, boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int> & f, boost::_bi::list2<boost::system::error_code const &,unsigned int const &> & a, int __formal) Line 393
    i2pd.exe!boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > >::operator()<boost::system::error_code,unsigned int>(const boost::system::error_code & a1, const unsigned int & a2) Line 103
    i2pd.exe!boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int>::operator()() Line 129
    i2pd.exe!boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> >(boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> & function, ...) Line 70
    i2pd.exe!boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > > >(boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> & function, boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > > & context) Line 37
    i2pd.exe!boost::asio::detail::win_iocp_socket_recv_op<boost::asio::mutable_buffers_1,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ntcp::NTCPSession,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ntcp::NTCPSession *>,boost::arg<1>,boost::arg<2> > > >::do_complete(boost::asio::detail::win_iocp_io_service * owner, boost::asio::detail::win_iocp_operation * base, const boost::system::error_code & result_ec, unsigned int bytes_transferred) Line 97
    i2pd.exe!boost::asio::detail::win_iocp_operation::complete(boost::asio::detail::win_iocp_io_service & owner, const boost::system::error_code & ec, unsigned int bytes_transferred) Line 46
    i2pd.exe!boost::asio::detail::win_iocp_io_service::do_one(bool block, boost::system::error_code & ec) Line 404
    i2pd.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec) Line 162
    i2pd.exe!boost::asio::io_service::run() Line 59
    i2pd.exe!i2p::Transports::Run() Line 86
orignal commented 10 years ago

Понятно, там race condition, когда с одной стороны соединение закрывается и удаляется, а с другой стороны кто то пытается к нему обратиться.

mikhail4021 commented 10 years ago

c:\users\mikhail\documents\github\i2pd\streaming.cpp(381): error C3861: 'htonll': identifier not found

вот что словил при компиляции

http://msdn.microsoft.com/en-us/library/windows/desktop/jj710199%28v=vs.85%29.aspx

а вот почему) там Minimum supported client Windows 8 [desktop apps only] chertov, у вас там виндовс 8 чтоли? на 7ке не работает, там же в I2PEndian ровно это закомментировано было. Надо как-то чинить реализацию с хабра.

be64toh не преобразовывала нормально,

это прям точно?

mikhail4021 commented 10 years ago

ладно, с бигиндиан я разобрался. но теперь тоже эта фигня

https://github.com/orignal/i2pd/issues/5#issuecomment-32960340

как понять что там мне из базы удалить, чтобы заработало?

orignal commented 10 years ago

Ничего не надо удалять - сам догадается что те маршутизаторы неправильные и выкинет их. Если ничего не находит то надо снова официальный клиент погонять некоторое время чтобы он перечитал базу и скопировать. Meeh начал заниматься тем чтобы и здесь это работало также.

chertov commented 10 years ago

mikhail4021, работает и на семерке и на восьмерке! тут же от компилятора зависит скорее, а не от версии винды... версия с хабра мне самому больше нравилась, просто функция получала число и не преобразовывала... в деббагере это было явно видно, разбираться было некогда, поэтому и схватил старую версию... она работала

chertov commented 10 years ago

собрал последнюю версию... ip серый, но роутеры находит и флибуста открылась! я так понимаю i2pd теперь может и на серых ip работать? Это благодаря реализации SSU?

orignal commented 10 years ago

SSU еще не реализован полностью. Почему у вас работает с серым IP честно говоря не знаю, не должен. Посмотрите на главной странице как обстоят дела со входящими тоннелями и печатаются ли сообщения вида "Connected from".

chertov commented 10 years ago

Connected from не вижу... а на страничке статистики есть строки вида: -->3681576963:ZWzj-->4115847519:Uefo-->2786370774:me 72918 -->2155486015:YCXT-->1662340038:Uefo-->3818465328:me 60752 New RouterInfo added постоянно строчит, сохраняет подключался через йоту, причем ета к роутеру, а он в сеть раздает локальные ip... и вроде у еты сейчас адреса все серые, внешние только для юрлиц флибуста открывалась, постараюсь все проверить...

пытаюсь реализовать простенький прокси сервер, с помощью https://github.com/joyent/http-parser парсю запросы от браузера и получаю хост, путь нечто вроде flibusta.i2p и /index.php Сейчас можно как-нибудь сконвертить flibusta.i2p в base32 адрес? пока что железно забиваю... типа как в hosts "наброски" в моем форке в ветке proxy если интересно https://github.com/chertov/i2pd/tree/proxy

Если я из другого потока буду работать с i2pd аналогично тому как это происходит в HTTPServer ничего страшного не произойдет?) функции i2p::stream::CreateStream, i2p::data::netdb.FindLeaseSet, i2p::data::Base32ToByteStream должны адекватно работать?

chertov commented 10 years ago

извиняюсь что в топике про поддержку Windows... работает вроде бы прокси флибусту открыло!

все жутко тормозит, но даже по ссылкам удалось немного походить... изменения пока буду коммитить в свою ветку: https://github.com/chertov/i2pd/tree/proxy там каша не хочется в основной репозиторий ее заливать

минут по 3-10 загружает страничку (основу - html), потом пишет Leases expired, если обновлять, то через какое-то время находит новый leaseSet и все снова, но работает!

orignal commented 10 years ago

Сейчас можно как-нибудь сконвертить flibusta.i2p в base32 адрес?

Он на главной странице флибусты есть. Было бы неплохо также реализовать разыменование адресов. Это работа с фалума hosts.txt и hostsdb.blockfile

orignal commented 10 years ago

Connected from не вижу... а на страничке статистики есть строки вида: -->3681576963:ZWzj-->4115847519:Uefo-->2786370774:me 72918 -->2155486015:YCXT-->1662340038:Uefo-->3818465328:me 60752

Скорее всего дело вот в этом 1662340038:Uefo -у вас к этому узлу есть исходящее соединение где то.

orignal commented 10 years ago

все жутко тормозит, но даже по ссылкам удалось немного походить... изменения пока буду коммитить в свою ветку: https://github.com/chertov/i2pd/tree/proxy там каша не хочется в основной репозиторий ее заливать

Посмотрел ваш код: тормозит все из-за этого std::this_thread::sleep_for (std::chrono::seconds(10)); // wait for 10 seconds не следует этого делать внутри асинхронных операций. Я это сделал чисто для отладки. Вообще LeaseSet следует запрашивать независимо, более того я бы делал это по таймеру - как только появился интерес к какому ту адресу то запросить его первый раз, а потом бы заводит таймер на время истечения первого тоннеля. Другая беда но это уже у меня что еще пока нету асинхронной версии Receive в Stream. Еще не понял зачем вам понадобился Cи-шный функтор, сделайте его методом класса, а потом bind-ом.

chertov commented 10 years ago

я имел в виду тормоза на этапе загрузки страницы, после того как он уже получил leaseSet и начал грузить страницу... заголовок виден, и так и висит несколько минут... видимо это условия в самой сети i2p такие, но хочется проверить под линуксом... оригинальный клиент немного быстрее справлялся, но он дольше работал

На мой взгляд страничка не должна писать "LeaseSet not found" или "Leases expired", "Not responding"... клиент i2p должен делать все возможное для установки соединения и если уж за некоторое время (допустим 5 минут) не смог, то вернуть ошибку прокси-сервера... вроде бы есть такие стандартные. Но пока для отладки эти сообщения очень удобны.

Про таймер тоже подумал, т.к. часто ловил "Leases expired".

orignal commented 10 years ago

я имел в виду тормоза на этапе загрузки страницы, после того как он уже получил leaseSet и начал грузить страницу... заголовок виден, и так и висит несколько минут... видимо это условия в самой сети i2p такие, но хочется проверить под линуксом... оригинальный клиент немного быстрее справлялся, но он дольше работал

У меня ничего такого не наблюдается - если уж он получил первое сообщение то остальные приходят в течении нескольких секунд. Возможно у вас дело во входящих тоннелях, то есть тоннели как бы есть но реально они нерабочие, потому что последний перед вами узел не может до вас достучаться. Если хотите это проверить то можете попробовать убрать таймаут в NTCPSession.cpp чтобы не закрывать соединение принудительно после минуты неактивности. Правда потом другая сторона закроет правда не знаю через какое время.

orignal commented 10 years ago

На мой взгляд страничка не должна писать "LeaseSet not found" или "Leases expired", "Not responding"... клиент i2p должен делать все возможное для установки соединения и если уж за некоторое время (допустим 5 минут) не смог, то вернуть ошибку прокси-сервера... вроде бы есть такие стандартные. Но пока для отладки эти сообщения очень удобны.

Естественно не должна. Надо как в официальном клиенте выдавать страницу что не получается и объяснять почему. Эти сообщения я сделал именно для отладки чтобы смотреть в чем проблема.