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

на случай, если вдруг кто подумывает о службе на винду. к выходным я должен выложить её. Она корректно стартует, но некорректно завершается, так что причесываю. Плюс, еще не до конца разобрался с этими заморочистыми правами пользователей, так что пока только от админа. В общем, если в субботу не будет, chertov, пни меня)

orignal commented 10 years ago

А с записью лога в файл, а не на консоль, разобрались?

mikhail4021 commented 10 years ago

нет еще. а что, это должно вызвать проблемы?

orignal commented 10 years ago

Так если это служба, то у нее нет консоли, поэтому весь лог нужно направить в какой то файл. Там в Log.h можно передавать поток в качестве параметра, который сейчас cout по умолчанию.

mikhail4021 commented 10 years ago

да это понятно. Log.h посмотрю.

mikhail4021 commented 10 years ago

Если приложение завершается до того, как выполнено i2p::transports.Start (); то оно вылетает с исключением

i2pd.exe!i2p::Transports::~Transports() Line 22 C++ i2pd.exe!i2p::Transports::Stop() Line 70 C++ i2pd.exe!boost::asio::basic_deadline_timerboost::posix_time::ptime,boost::asio::time_traits<boost::posix_time::ptime,boost::asio::deadline_timer_serviceboost::posix_time::ptime,boost::asio::time_traits >::cancel() Line 216 C++

видимо транспорт там где-то статически объявлен или что-то вроде того и не может корректно завершиться. Есть идеи "почему"?

orignal commented 10 years ago

Да там постоянно грохается при останове, просто обычно это никого не волнует.

mikhail4021 commented 10 years ago

службы в винде нужно устанавливать, а я думал делать это прописав --service=install в параметрах. Соответственно после корректной установки все падает, что нелогично)

orignal commented 10 years ago

Вы хотите сказать что падают деструкторы голобальных переменных без запуска? Если так то это проблема. Разберусь.

orignal commented 10 years ago

Починил

mikhail4021 commented 10 years ago

R6010

The thread 0x5e8 has exited with code 3 (0x3). The thread 0x504 has exited with code 3 (0x3).

там видимо не все потоки джойнятся до завершения основного и выбрасывается исключение, которое не ловится, отсюда abort(). Соответственно, это тоже где-то в статике, так как ошибка возникает, если "return 0" написать в начале main().

mikhail4021 commented 10 years ago

Напишу опять в мою любимую ветку, хотя это не совсем сюда.

Есть значит такой класс

    template<class Msg>
class MsgQueue: public Queue<Msg>
{
    public:

        MsgQueue (): m_Thread (std::bind (&MsgQueue<Msg>::Run, this)) , running(1) {};

        void Stop()
        {
            running = 0;
            m_Thread.join();
        }

    private:
        void Run ()
        {
            Msg * msg = nullptr;
            while (((msg = Queue<Msg>::GetNext ()) != nullptr) && running)
            {
                msg->Process ();
                delete msg;
            }   
        }   

    private:
        std::thread m_Thread;
        int running;
};

а деструктора в нем нет. На мой взгляд, он должен выглядеть как-то так

~MsgQueue() { WakeUp(); Stop(); }

но почему-то join() не происходит. где косяк?

orignal commented 10 years ago

А ну понятно где косяк. Там в Stop надо вставить Put (nullptr) перед join.

mikhail4021 commented 10 years ago

Но ведь вызова WakeUp(); перед STOP() должно быть достаточно, или нет?

orignal commented 10 years ago

По уму должно быть достаточно. Надо смотреть в чем проблема. Вообще эта реализация очереди крайне дурацкая - ее по уму переделать на атомарные операции надо.

Кстати под лиунксом все нормально выходит

chertov commented 10 years ago

Собрал последние исходники. при создании RouterContext context; вызывается bool RouterContext::Load (), который использует i2p::util::filesystem::GetDataDir (), а mapArgs в строке if (i2p::util::config::mapArgs.count("-datadir")) при этом еще не инициализирован... прога вылетает

решил пока принудительно указав приоритет инициализации в util.cpp #pragma init_seg( ".CRT$XCB" )

#ifdef WIN32
#include <Windows.h>
#include <shlobj.h>
#pragma init_seg( ".CRT$XCB" )
#endif

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

orignal commented 10 years ago

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

P.S: Кстати SSU работает и умеет определять свой внешний IP самостоятельно. Посмотрите что получается у вас.

chertov commented 10 years ago

у меня сегодня весь день клиент в консоли висел... на сайты заходил хорошо и практически сразу, заметил что на страничке статистики появился пункт с SSU, но никаких соединений там почему-то не было когда ее смотрел периодически...

orignal commented 10 years ago

А в самом начале ваш IP показал правильно? SSU может и не быть потому что сначала он пытается по NTCP соединиться. Возможно что у вас к тому же RouterInfo содержит запись только про NTCP. Чтобы появилось SSU надо удалить файл router.info и перезапустить, тогда создастся новый в котором будет прописан и SSU

chertov commented 10 years ago

Да, ip определил правильно! Для удобства вывел его на страничку статистики.

Потер все вместе с netDB, перезапустил и очень даже шустренько он скачал себе пиров и практически в считанные секунды уже начал соединятся с флибустой... Одна строчка с SSU все же появилась на странице статистике!

UPD: Вылетело в SSU.cpp "Expression: map/set iterator not dereferencable" stack

orignal commented 10 years ago

Это при поптыке подключиться через introducer? Поправил

chertov commented 10 years ago

Вылетел в I2NPProtocol.h buf при этом оказался NULL

106     I2NPHeader * GetHeader () { return (I2NPHeader *)(buf + offset); };
107 >   uint8_t * GetPayload () { return buf + offset + sizeof(I2NPHeader); };
108     uint8_t * GetBuffer () { return buf + offset; };
109     size_t GetLength () const { return len - offset; };
>   i2pd.exe!i2p::I2NPMessage::GetPayload() Line 107
    i2pd.exe!i2p::tunnel::Tunnel::EncryptTunnelMsg(i2p::I2NPMessage * tunnelMsg) Line 119
    i2pd.exe!i2p::tunnel::TunnelGateway::SendBuffer() Line 168
    i2pd.exe!i2p::tunnel::OutboundTunnel::SendTunnelDataMsg(std::vector<i2p::tunnel::TunnelMessageBlock,std::allocator<i2p::tunnel::TunnelMessageBlock> > msgs) Line 163
    i2pd.exe!i2p::data::NetDb::Explore() Line 544
    i2pd.exe!i2p::data::NetDb::Run() Line 122
    [External Code] 

Еще замечаю что LeaseSet запрашивается через HTTPProxy постоянно... такое ощущение что в

auto leaseSet = i2p::data::netdb.FindLeaseSet (destination);

destination передается какой-то некорректный. В результате он не находится и в ответ прокси всегда пишет "LeaseSet not found". Через обычный HTTPServer LeaseSet находит для того же адреса, но даже в этом случае пишет "LeaseSet not found" в HTTPProxy. Постараюсь все аккуратно проверить.

orignal commented 10 years ago

HTPProxy делал не я, сам еще не смотрел, потому не знаю что там. Создайте отдельное issue по английски и пусть товарищ посмотрит.

buf с нулевым указателем подозреваю что и tunnelMsg тоже нулевой. Посмотрю откуда это

chertov commented 10 years ago

разобрался, я в hosts b32 адрес записывал руками... в i2p там длинный адрес используется

orignal commented 10 years ago

Кстати если в директорию .i2pd положить файл hosts.txt то можно символьными адресами пользоваться типа www.i2p2.i2p

chertov commented 10 years ago

Очень классно работает асинхронная загрузка! Значительно быстрее стало открывать странички!

Пытаюсь HTTP Server и Proxy привести к двум классам наследованным от HTTPConnection. Запускаю для отладки и один раз вылетел вот тут:

>   i2pd.exe!i2p::garlic::GarlicRouting::WrapMessage(const i2p::data::RoutingDestination & destination, i2p::I2NPMessage * msg, const i2p::I2NPMessage * leaseSet) Line 270 C++
    i2pd.exe!i2p::stream::Stream::SendPacket(const unsigned char * buf, unsigned int len) Line 303  C++
    i2pd.exe!i2p::stream::Stream::SendQuickAck() Line 207   C++
    i2pd.exe!i2p::stream::Stream::HandleNextPacket(i2p::stream::Packet * packet) Line 65    C++
    i2pd.exe!i2p::stream::StreamingDestination::HandleNextPacket(i2p::stream::Packet * packet) Line 376 C++
    i2pd.exe!i2p::stream::StreamingDestinations::PostNextPacket(i2p::data::IdentHash destination, i2p::stream::Packet * packet) Line 519    C++
    i2pd.exe!boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>::operator()(i2p::stream::StreamingDestinations * p, i2p::data::IdentHash a1, i2p::stream::Packet * a2) Line 280   C++
    i2pd.exe!boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> >::operator()<boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list0>(boost::_bi::type<void> __formal, boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *> & f, boost::_bi::list0 & a, int __formal) Line 393  C++
    i2pd.exe!boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > >::operator()() Line 21  C++
    i2pd.exe!boost::asio::asio_handler_invoke<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > > >(boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > > & function, ...) Line 70    C++
    i2pd.exe!boost_asio_handler_invoke_helpers::invoke<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > >,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > > >(boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > > & function, boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > > & context) Line 37 C++
    i2pd.exe!boost::asio::detail::completion_handler<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::stream::StreamingDestinations,i2p::data::IdentHash,i2p::stream::Packet *>,boost::_bi::list3<boost::_bi::value<i2p::stream::StreamingDestinations *>,boost::_bi::value<i2p::data::IdentHash>,boost::_bi::value<i2p::stream::Packet *> > > >::do_complete(boost::asio::detail::win_iocp_io_service * owner, boost::asio::detail::win_iocp_operation * base, const boost::system::error_code & __formal, unsigned int __formal) Line 68    C++
    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  C++
    i2pd.exe!boost::asio::detail::win_iocp_io_service::do_one(bool block, boost::system::error_code & ec) Line 404  C++
    i2pd.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec) Line 162 C++
    i2pd.exe!boost::asio::io_service::run() Line 59 C++
    i2pd.exe!i2p::stream::StreamingDestinations::Run() Line 493 C++
    [External Code] 

leaseSet при этом NULL передался в GarlicRouting::WrapMessage Вот так локальные переменные выглядят

orignal commented 10 years ago

У меня тоже на этом месте иногда вылетает. Пока не знаю в чем дело. Правда у меня это происходит при запросе LeaseSet-а. В вашем случае очевидно что Stream к этому моменту удален из другого треда - там надо мьютекс поставить, у меня более сложный случай. Нулевой leaseset это нормально - это означает что его передавать на надо.

orignal commented 10 years ago

chertov, а вы бы не хотели заняться всей координацей поддержки Windows?

chertov commented 10 years ago

Стараюсь периодически собирать исходники и проверять работоспособность. Если в исходниках что-то появится такое чего виндовский компилятор не соберет, то я обязательно сообщу. А так в голове летает мысль сделать: 1) маленькую программку (просто иконка в трее) для запуска/остановки сервиса i2pd + ее можно использовать и как "обновлятор" бинарника i2pd 2) простой инсталлятор на базе опенсорсного NSIS http://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System 3) ну можно еще настроенную portable mozilla прицепить

Смотрю meeh420 к проекту travis-ci прикрутил... в чистом виде винда вроде бы там не поддерживается, но может получится сделать билд через mingw. Не совсем понял можно ли оттуда как-то бинарники забирать.

chertov commented 10 years ago

Кстати, раньше такого не замечал... в консоль часто пишет

Garlic
ElGamal decrypt hash doesn't match
Failed to decrypt garlic

тот же http://i2p-projekt.i2p/hosts.txt и флибуста пишут Not responding

также после длительного простоя пишет "Leases expired" и запрашивает его еще раз... я думал он с какого-то коммита автоматически должен был поддерживаться в актуальном состоянии. Так и должно быть?

orignal commented 10 years ago

Кстати, раньше такого не замечал... в консоль часто пишет

Это странно. У меня такого нет. Скорее всего где то неправильно из кусков собирается - у меня это еще не сделано. А проблема возникает из-за потерянных пакетов. У меня кстати тоже появилась проблема с установкой NTCP соединений после выхода 0.9.12, потому все время переключается на недоделанный SSU.

также после длительного простоя пишет "Leases expired" и запрашивает его еще раз... я думал он с какого-то коммита автоматически должен был поддерживаться в актуальном состоянии. Так и должно быть?

Вы все понимаете правильно. Думаю дело в том что у вас входящие тоннели успели помереть и ответы не приходят. P.S: Сделал чтобы входящие тоннели создавались через те же узлы что и исходящие. Сейчас должно стать лучше

orignal commented 10 years ago

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

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

в чистом виде винда вроде бы там не поддерживается, но может получится сделать билд через mingw.

В принципе mingw должен должен собирать с помощью обычного линксного Makefile-а. Едиснтвенное что может придется I2PEndian подкрутить.

chertov commented 10 years ago

неожиданно упало в \cryptopp562\cryptopp\misc.cpp

void UnalignedDeallocate(void *p)
{
>>> free(p);
}
    msvcr120d.dll!58b614fa()    Unknown
    [Frames below may be incorrect and/or missing, no symbols loaded for msvcr120d.dll] 
    [External Code] 
>   i2pd.exe!CryptoPP::UnalignedDeallocate(void * p) Line 182   C++
    i2pd.exe!CryptoPP::AllocatorWithCleanup<unsigned char,0>::deallocate(void * p, unsigned int n) Line 112 C++
    i2pd.exe!CryptoPP::SecBlock<unsigned char,CryptoPP::AllocatorWithCleanup<unsigned char,0> >::~SecBlock<unsigned char,CryptoPP::AllocatorWithCleanup<unsigned char,0> >() Line 261   C++
    [External Code] 
    i2pd.exe!CryptoPP::CBC_Encryption::ProcessData(unsigned char * outString, const unsigned char * inString, unsigned int length) Line 159 C++
    i2pd.exe!i2p::ssu::SSUSession::FillHeaderAndEncrypt(unsigned char payloadType, unsigned char * buf, unsigned int len, const unsigned char * aesKey, const unsigned char * iv, const unsigned char * macKey) Line 509    C++
    i2pd.exe!i2p::ssu::SSUSession::Send(unsigned char type, const unsigned char * payload, unsigned int len) Line 991   C++
    i2pd.exe!i2p::ssu::SSUSession::ProcessPeerTest(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 830    C++
    i2pd.exe!i2p::ssu::SSUSession::ProcessMessage(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 144 C++
    i2pd.exe!i2p::ssu::SSUSession::ProcessNextMessage(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 121 C++
    i2pd.exe!i2p::ssu::SSUServer::HandleReceivedFrom(const boost::system::error_code & ecode, unsigned int bytes_transferred) Line 1059 C++
    i2pd.exe!boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>::operator()(i2p::ssu::SSUServer * p, const boost::system::error_code & a1, unsigned int a2) Line 280 C++
    i2pd.exe!boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> >::operator()<boost::_mfi::mf2<void,i2p::ssu::SSUServer,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::ssu::SSUServer,boost::system::error_code const &,unsigned int> & f, boost::_bi::list2<boost::system::error_code const &,unsigned int const &> & a, int __formal) Line 393   C++
    i2pd.exe!boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,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   C++
    i2pd.exe!boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int>::operator()() Line 129   C++
    i2pd.exe!boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,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::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> & function, ...) Line 70    C++
    i2pd.exe!boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > > >(boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> & function, boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > > & context) Line 37   C++
    i2pd.exe!boost::asio::detail::win_iocp_socket_recvfrom_op<boost::asio::mutable_buffers_1,boost::asio::ip::basic_endpoint<boost::asio::ip::udp>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,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 104  C++
    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  C++
    i2pd.exe!boost::asio::detail::win_iocp_io_service::do_one(bool block, boost::system::error_code & ec) Line 404  C++
    i2pd.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec) Line 162 C++
    i2pd.exe!boost::asio::io_service::run() Line 59 C++
    i2pd.exe!i2p::Transports::Run() Line 155    C++
    [External Code] 

перед этим в консоль написало:

New RouterInfo added
Creating destination inbound tunnel...
SSU sent 1088 bytes
Msg sent: 1056
Tunnel test 1920074283 failed
Tunnel test -1881870907 failed
Msg sent: 1056
SSU received 93 bytes
SSU peer test received
SSU peer test from Bob. We are Charlie
Assertion failed: length%BlockSize()==0, file \cryptopp562\cryptopp\modes.cpp, line 159
HTTP response 504
Exploring new routers ...

впрочем когда я останавливаю процесс для отладки, то часто падает после продолжения, но это падение вроде бы без остановок было

orignal commented 10 years ago

Вот все написано Assertion failed: length%BlockSize()==0, file \cryptopp562\cryptopp\modes.cpp, line 159 Вообщем надо сделать выравнивание по границе 16 байт как сделано в методе Decrypt encryptedLen = (encryptedLen/16)*16; // make sure 16 bytes boundary

Поправлю

chertov commented 10 years ago

еще вывалился в SSU.cpp что-то вроде "Stack around the variable 'buf' was corrupted"

                len = 0;
            fragmentNum++;
        }   
>>> }       

    void SSUSession::Send (uint8_t type, const uint8_t * payload, size_t len)
    {
>   i2pd.exe!i2p::ssu::SSUSession::Send(i2p::I2NPMessage * msg) Line 974    C++
    i2pd.exe!i2p::ssu::SSUSession::Established() Line 609   C++
    i2pd.exe!i2p::ssu::SSUSession::ProcessData(unsigned char * buf, unsigned int len) Line 774  C++
    i2pd.exe!i2p::ssu::SSUSession::ProcessMessage(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 131 C++
    i2pd.exe!i2p::ssu::SSUSession::ProcessNextMessage(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 121 C++
    i2pd.exe!i2p::ssu::SSUServer::HandleReceivedFrom(const boost::system::error_code & ecode, unsigned int bytes_transferred) Line 1059 C++
    i2pd.exe!boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>::operator()(i2p::ssu::SSUServer * p, const boost::system::error_code & a1, unsigned int a2) Line 280 C++
    i2pd.exe!boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> >::operator()<boost::_mfi::mf2<void,i2p::ssu::SSUServer,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::ssu::SSUServer,boost::system::error_code const &,unsigned int> & f, boost::_bi::list2<boost::system::error_code const &,unsigned int const &> & a, int __formal) Line 393   C++
    i2pd.exe!boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,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   C++
    i2pd.exe!boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int>::operator()() Line 129   C++
    i2pd.exe!boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,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::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> & function, ...) Line 70    C++
    i2pd.exe!boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > > >(boost::asio::detail::binder2<boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > >,boost::system::error_code,unsigned int> & function, boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,boost::arg<1>,boost::arg<2> > > & context) Line 37   C++
    i2pd.exe!boost::asio::detail::win_iocp_socket_recvfrom_op<boost::asio::mutable_buffers_1,boost::asio::ip::basic_endpoint<boost::asio::ip::udp>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,i2p::ssu::SSUServer,boost::system::error_code const &,unsigned int>,boost::_bi::list3<boost::_bi::value<i2p::ssu::SSUServer *>,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 104  C++
    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  C++
    i2pd.exe!boost::asio::detail::win_iocp_io_service::do_one(bool block, boost::system::error_code & ec) Line 404  C++
    i2pd.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec) Line 162 C++
    i2pd.exe!boost::asio::io_service::run() Line 59 C++
    i2pd.exe!i2p::Transports::Run() Line 155    C++
    [External Code] 
    [Frames below may be incorrect and/or missing, no symbols loaded for msvcp120d.dll] 
chertov commented 10 years ago

Я сделал некоторую поддержку кодов состояния HTTP. Немного потестирую и залью, но заметил что возникают неприятные ситуации. Загружаю hosts.txt. Он долго запрашивается, но рано или поздно начинает скачиваться... в консоли начинают мелькать Garlic'и. И в определенный момент видимо соединение разрывается, но hosts.txt еще не скачался до конца, либо его из пришедших кусков как-то не так собрало. В итоге соединение рвется и получается что-то вроде такого:

xolotl.i2p=byBX2... последний адрес... MHPCEmlUHTTP/1.0 504 Gateway Timeout

NULLContent-Length: 6562

Content-Type: text/html

<html><img alt="" src="data:image/png;base64,iVBO... наша пикча  ...AAElFTkSuQmCC" /><br>Not responding</html>

Как видим в буффер попал кусок hosts.txt, затем долго нет ответа и отправляется ошибка 504 Not responding, но приклеивается она к уже заполненому буфферу и корректно клиент воспринимать уже не может. Ситуация возникает достаточно редко... наверное нужно где-то почистить буффер или увеличить время ожидания, либо ожидать пока туннели живы.

orignal commented 10 years ago

А почему html страницы нормально грузятся?
Там вообще то у каждого пакета есть номер и не в том порядке собраться не может. То что не докачалось до конца такое возможно, но это я еще переделаю когда доделаю отправку сообщений.

chertov commented 10 years ago

Да, со страничками такого не замечал... возможно дело в другом.

Добавил код, который давно висит в пулл ревесте https://github.com/orignal/i2pd/pull/42 Служба устанавливается и удаляется, но есть тонкости над которыми еще придется поработать. Не умеет сама открывать порты и требует права администратора для установки и удаления службы.

Сейчас получается дублирование кода запуска и остановки основных систем i2pd. В i2p.cpp и в коде виндовского сервиса. Думаю стоит вытащить их в отдельный класс с методами старт/стоп.

Мне кажется не очень удобно когда значение настроек по умолчанию задается непосредственно при получении настройки. Например:

HTTPServer(i2p::util::config::GetArg("-httpport", 7070))

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

orignal commented 10 years ago

Заведите список констант со значениями по умолчанию и вынесите в отдельный .h файл.

Создайте базовый класс под названием типа Daemon и от него две реализации.

chertov commented 10 years ago

На данный момент виндовский сервис начал запускаться и работать нормально, загружает hosts.txt, открывает линки. Насколько я понял, в режиме виндовского сервиса все что процесс пишет в std::cout уходит вникуда... пришлось писать лог в ofstream руками через Log.cpp. Также еще необходимо поработать над установкой/удалением сервиса. Проверять статус, останавливать/запускать... иначе он либо не удаляется, либо находится в состоянии "помечен для удаления". Сейчас i2pd падает при завершении... вроде бы на GetNonThreadSafe() в Queue.h как-то падал. Это не очень хорошо т.к. сервис завершается иногда тоже некорректно.

Есть некоторый набросок простейшей программки на Qt, которая посредством QSystemTrayIcon реализует иконку в трее и меню с запуском/остановкой сервиса Qt. Также может загружать установочный файл и его md5 по http ссылке, проверять md5 и потом можно будет запустить его на установку. Пока 7 файлов вместе с файлами проекта. Ничего если залью в этот же репозиторий, скажем в папку gui_manager?

orignal commented 10 years ago

Там std::cout это дефолтный параметр. Надо передапвать поток на файл.

Вот здесь у вас сделано нехорошо: Daemon.logfile << s.str(); Daemon.logfile.flush(); Надо flush вызывать только когда очередь пустая

Заливайте

chertov commented 10 years ago

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

Падает тут:

>   i2pd_d.exe!i2p::ssu::SentMessage::~SentMessage() Line 64    C++
    [External Code] 
    i2pd_d.exe!i2p::ssu::SSUData::~SSUData() Line 26    C++
    i2pd_d.exe!i2p::ssu::SSUSession::~SSUSession() Line 31  C++
    [External Code] 
    i2pd_d.exe!i2p::ssu::SSUServer::DeleteSession(i2p::ssu::SSUSession * session) Line 1042 C++
    i2pd_d.exe!i2p::Transports::PostCloseSession(const i2p::data::RouterInfo * router) Line 278 C++
    i2pd_d.exe!boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>::operator()(i2p::Transports * p, const i2p::data::RouterInfo * a1) Line 165 C++
    i2pd_d.exe!boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> >::operator()<boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list0>(boost::_bi::type<void> __formal, boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *> & f, boost::_bi::list0 & a, int __formal) Line 314   C++
    i2pd_d.exe!boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > >::operator()() Line 21   C++
    i2pd_d.exe!boost::asio::asio_handler_invoke<boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > > >(boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > > & function, ...) Line 70    C++
    i2pd_d.exe!boost_asio_handler_invoke_helpers::invoke<boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > >,boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > > >(boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > > & function, boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > > & context) Line 37   C++
    i2pd_d.exe!boost::asio::detail::completion_handler<boost::_bi::bind_t<void,boost::_mfi::mf1<void,i2p::Transports,i2p::data::RouterInfo const *>,boost::_bi::list2<boost::_bi::value<i2p::Transports *>,boost::_bi::value<i2p::data::RouterInfo const *> > > >::do_complete(boost::asio::detail::win_iocp_io_service * owner, boost::asio::detail::win_iocp_operation * base, const boost::system::error_code & __formal, unsigned int __formal) Line 68 C++
    i2pd_d.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    C++
    i2pd_d.exe!boost::asio::detail::win_iocp_io_service::do_one(bool block, boost::system::error_code & ec) Line 404    C++
    i2pd_d.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec) Line 162   C++
    i2pd_d.exe!boost::asio::io_service::run() Line 59   C++
    i2pd_d.exe!i2p::Transports::Run() Line 157  C++
    [External Code] 

говорит

HEAP CORRUPTION DETECTED: after Normal block (#278348) at 0x04BE6810.
CRT detected that the application wrote to memory after end of heap buffer.

в лог перед этим писал "Phase 4 read error: End of file"

orignal commented 10 years ago

Все время падает или в каких то определеных ситуациях?

chertov commented 10 years ago

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

orignal commented 10 years ago

Там падение явно связано с перепосылкой неподтвержденных пакетов по SSU. У меня такая фигня тоже случается, но крайне редко - опять где то "race condition".

orignal commented 10 years ago

Пофиксил. Пробуйте

chertov commented 10 years ago

Не получилось потестить пока. При первом запуске падает тут:

>   i2pd_d.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> >::_Eqrange(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Keyval) Line 2005 C++
    i2pd_d.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> >::equal_range(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Keyval) Line 1600  C++
    i2pd_d.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> >::count(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Keyval) Line 1567    C++
    i2pd_d.exe!i2p::util::config::GetArg(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & strArg, int nDefault) Line 91 C++
    i2pd_d.exe!i2p::RouterContext::NewRouterInfo() Line 33  C++
    i2pd_d.exe!i2p::RouterContext::CreateNewRouter() Line 27    C++
    i2pd_d.exe!i2p::RouterContext::RouterContext() Line 19  C++
    i2pd_d.exe!i2p::`dynamic initializer for 'context''() Line 12   C++

При этом создает только router.keys

При втором тут:

    i2pd_d.exe!CryptoPP::ByteReverse<unsigned int>(unsigned int * out, const unsigned int * in, unsigned int byteCount) Line 933    C++
    i2pd_d.exe!CryptoPP::IteratedHashBase<unsigned int,CryptoPP::HashTransformation>::HashMultipleBlocks(const unsigned int * input, unsigned int length) Line 92   C++
    i2pd_d.exe!CryptoPP::IteratedHashBase<unsigned int,CryptoPP::HashTransformation>::Update(const unsigned char * input, unsigned int len) Line 55 C++
>   i2pd_d.exe!CryptoPP::PK_MessageAccumulatorBase::Update(const unsigned char * input, unsigned int length) Line 292   C++
    i2pd_d.exe!CryptoPP::PK_Verifier::VerifyMessage(const unsigned char * message, unsigned int messageLen, const unsigned char * signature, unsigned int signatureLength) Line 789 C++
    i2pd_d.exe!i2p::data::RouterInfo::ReadFromBuffer() Line 107 C++
    i2pd_d.exe!i2p::data::RouterInfo::Update(const unsigned char * buf, int len) Line 56    C++
    i2pd_d.exe!i2p::RouterContext::Load() Line 110  C++
    i2pd_d.exe!i2p::RouterContext::RouterContext() Line 17  C++
    i2pd_d.exe!i2p::`dynamic initializer for 'context''() Line 12   C++

Но успевает написать в консоль: Can't open file C:\Users\user\AppData\Roaming\i2pd\router.info

orignal commented 10 years ago

Опять нарушена последовательность инициализации - этот std::map<std::string, std::string> mapArgs; явно неинициализирован

orignal commented 10 years ago

Вас нам очень не хватает, потому что версия под винды нужна многим, а у нас даже собрать не получается,

orignal commented 10 years ago

Попробуйте снова, удалив router.keys и router.info