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 отличий) Очень бы хотелось иметь кросплатформенные исходники и собирать проект родным компилятором под виндой.

chertov commented 10 years ago

Запускается нормально! Но, к сожалению, через минуту-две упало вот тут:

>   i2pd_d.exe!i2p::ssu::SentMessage::~SentMessage() Line 64    C++
    [External Code] 
    i2pd_d.exe!i2p::ssu::SSUData::ProcessSentMessageAck(unsigned int msgID) Line 34 C++
    i2pd_d.exe!i2p::ssu::SSUData::ProcessAcks(unsigned char * & buf, unsigned char flag) Line 49    C++
    i2pd_d.exe!i2p::ssu::SSUData::ProcessMessage(unsigned char * buf, unsigned int len) Line 220    C++
    i2pd_d.exe!i2p::ssu::SSUSession::ProcessData(unsigned char * buf, unsigned int len) Line 719    C++
    i2pd_d.exe!i2p::ssu::SSUSession::ProcessMessage(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 134   C++
    i2pd_d.exe!i2p::ssu::SSUSession::ProcessNextMessage(unsigned char * buf, unsigned int len, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp> & senderEndpoint) Line 124   C++
    i2pd_d.exe!i2p::ssu::SSUServer::HandleReceivedFrom(const boost::system::error_code & ecode, unsigned int bytes_transferred) Line 963    C++
    i2pd_d.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_d.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_d.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_d.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_d.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_d.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_d.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_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::ssu::SSUServer::Run() Line 916  C++
    [External Code] 

пишет: HEAP CORRUPTION DETECTED: after Normal block (#142771) at 0x03E33230. CRT detected that the application wrote to memory after end of heap buffer. и при повторных запусках тоже самое происходит...

По поводу сборки под виндой могу настроить, если есть сервер с виндой. Либо заливать куда-нибудь свои собранные бинарники периодически. Я пытался собрать с помощью mingw чтобы можно было автоматически собирать билд для винды под линуксом, но до конца не довел. Давно хочу настроить сборку через cmake, но все никак не доведу до ума...

Заметил лог сборки под виндой на jenkins и там ошибка cryptlib.lib(rsa.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in AddressBook.obj [c:\Jenkins\workspace\i2pd-win32-msvc (PurpleI2P)\Win32\i2pd.vcxproj]

Это связано с тем что cryptlib по умолчанию собирается как "Multi-threaded Debug", а i2pd собирается как "Multi-threaded Debug DLL"... нужно чтобы эти настройки проекта совпадали. Задаются они в свойстве проекта в меню слева Configuration Properties -> C/С++ -> Code Generation в этом пункте на панели справа Runtime Library отвечает за этот параметр.

Выглядит оно так: mdd

Я собираю cryptlib как Multi-threaded Debug DLL.

orignal commented 10 years ago

Спасибо, разбираются с билдом. Падает все время на том же месте?

mikalv commented 10 years ago

Hi chertov,

Sorry I don't speak Russian well, almost none at all. I would be happy to give you access to our jenkins and the virtual machine I run for VS2013 if you can set it up for us. I've just worked some time on a projct with C# in my dayjob, so I'm not so familiar with VC++ nor Win32 in general. If so, could you please send me a mail with an IP so I can allow you in the firewall? send it to mikal@privacysolutions.no and I reply with the password for remote desktop! Also if you want you can join IRC and I'll tell you a bit on how I've tried to set it up.. But unfortunately you have to listen on me in english then. I'm also planning to setup a Mingw build there based on the Qt 5.3 packages. Since we got a lot of Qt projects too :) By the way, do you got a GPG? I prefer sending pw in GPG, so we can verify we're talking to right person :)

спасибо!

/Mikal

orignal commented 10 years ago

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

Теперь вопросы:

  1. Зачем понадобилось менять проект на какой то измененный VS2013?
  2. Удалось собрать только статическую сборку. С dll не получается
ygrishin commented 9 years ago

original, а где та проблема с SSU detection под Windows, уже есть созданная issue?

orignal commented 9 years ago

Наверное не с SSU, а с MTU

https://github.com/PurpleI2P/i2pd/issues/107

ygrishin commented 9 years ago

Спешу сообщить что концепция определения MTU под Windows отработана на прототипах, теперь код из прототипов переносится непосредственно в рабочую функцию. Когда точно будет завершена работа -- пока не буду обещать, если повезет то совсем скоро.

ygrishin commented 9 years ago

Готово https://github.com/PurpleI2P/i2pd/pull/163

l-n-s commented 7 years ago

Windows should work fine now.