2013-06-17 2 views
0

Я пытаюсь отправить Raw TCP-пакет в сети, используя библиотеку boost :: asio. Моя программа хорошо работает на Mac OS X 10.8, но при запуске программы под Windows 7, я получаю исключение (в консоли): Error: send_to: An invallid argument was supplied. Код, чтобы открыть сокет и метод send_to() является:send_to: Был указан недопустимый аргумент

try { 
    socket_.open(); 
    socket_.send_to(request_buffer.data(), ep); 
} catch (std::exception& e) { 
    std::cerr << "Error: " << e.what() << std::endl; 
} 

Для определения конечной точки:

ip::address_v4::bytes_type b = {{XXX, XXX, XXX, XXX}}; 
ip::raw::endpoint ep(boost::asio::ip::address_v4(b), (portnumber); 

Как я могу решить исключение, чтобы программа могла работать под Windows? В окне вывода из Visual Studio 2010 исключение составляет:

First-chance exception at 0x000007fefcce9e5d (KernelBase.dll) in (programname).exe: Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x0,... 
+0

библиотека Что сети, которую вы с помощью? –

+0

Я использую boost :: asio – compu92

+0

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

ответ

1

кажется, что RAW TCP сокеты заблокированы в Windows 7 (http://msdn.microsoft.com/nl-nl/library/windows/desktop/ms740548(v=vs.85).aspx). Используя эту ссылку (http://www.savarese.com/software/rocksaw/#Q4), история подтверждена и для того, чтобы писать TCP-пакеты через сырой сокет в Windows: вам нужно открыть сокет с IPPROTO_IP или IPPROTO_RAW. Затем вы должны установить опцию сокета IP_HDRINCL и заполнить как заголовки IP, так и TCP каждого пакета. Что это означает в плане RockSaw, так это то, что в Windows вы должны использовать RawSocket.getProtocolByName («ip») и setIPHeaderInclude (true).

Поэтому с усилением :: Asio, кажется inpossible послать пакет с собственным IP-заголовка и пользовательского TCP-пакета (см GitHub Кевин Конли, названный выше в комментарии)