Подключение к сокету в C ++ и Boost Asio в условном случае - PullRequest
0 голосов
/ 02 июня 2011

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

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

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

Я попытался в условном случае заполнить код, который создает io_obejct, и попытался подключиться к сокету, но он не работает:

if (mode == A_CONDITION) {
    using boost::asio::ip::tcp;
    boost::asio::io_service io_service;

    tcp::resolver resolver(io_service);

    tcp::resolver::query query(tcp::v4(), server, boost::lexical_cast<string>(porta));

    tcp::resolver::iterator iterator = resolver.resolve(query);

    tcp::socket s(io_service);
    s.connect(*iterator);   
}

, поскольку в выражении if определено «s», в остальной части кода оно выходит за рамки видимости, поэтому я не компилирую:

В функции 'int main(int, char**)':
/home/user/src/main.cpp:960:26: ошибка: 's' не была объявлена ​​в этой области
/home/user/src/main.cpp:972:60: ошибка: 's'не был объявлен в этой области
/home/user/src/main.cpp:1080:60: error: 's' не было объявлено в этой области

Это происходит потому, что я трижды *

boost::asio::write(s, boost::asio::buffer(heading_data, heading_length));

использую внешнюю часть условного блока if.

Iне могу включить запись в сокет в блоке условного регистра, поэтому я думаю, что мне нужно использовать глобальное определение 's', но я не знаю, как это сделать, или есть другое лучшее решение.

Я надеюсь, что вы можете помочь мне:)

РЕДАКТИРОВАТЬ для чистой привлекательности: Если я сделаю это:

 tcp::socket *s = 0;

 boost::asio::io_service io_service;

 tcp::resolver resolver(io_service);

 tcp::resolver::query query(tcp::v4(), server, boost::lexical_cast<string>(porta));

 tcp::resolver::iterator iterator = resolver.resolve(query);


 if (mode = FOLLOW_MODE){ 
 s = new tcp::socket(io_service);
 s->connect(*iterator);  
 }

Это дает мне эти ошибки во время компиляции:

> In file included from
> /usr/include/boost/asio/write.hpp:526:0,
>                  from /usr/include/boost/asio/buffered_write_stream.hpp:32,
>                  from /usr/include/boost/asio/buffered_stream.hpp:26,
>                  from /usr/include/boost/asio.hpp:34,
>                  from /home/user/src/main.cpp:9:
> /usr/include/boost/asio/impl/write.ipp:
> In function 'size_t
> boost::asio::write(SyncWriteStream&,
> const ConstBufferSequence&,
> CompletionCondition,
> boost::system::error_code&) [with
> SyncWriteStream =
> boost::asio::basic_stream_socket<boost::asio::ip::tcp>*, ConstBufferSequence =
> boost::asio::const_buffers_1,
> CompletionCondition =
> boost::asio::detail::transfer_all_t,
> size_t = unsigned int]':
> /usr/include/boost/asio/impl/write.ipp:57:71:
> instantiated from 'size_t
> boost::asio::write(SyncWriteStream&,
> const ConstBufferSequence&) [with
> SyncWriteStream =
> boost::asio::basic_stream_socket<boost::asio::ip::tcp>*, ConstBufferSequence =
> boost::asio::const_buffers_1, size_t =
> unsigned int]'
> /home/user/src/main.cpp:980:78:  
> instantiated from here
> /usr/include/boost/asio/impl/write.ipp:44:57:
> error: request for member 'write_some'
> in 's', which is of non-class type
> 'boost::asio::basic_stream_socket<boost::asio::ip::tcp>*' make[2]: ***
> [src/CMakeFiles/main.dir/main.cpp.o]
> Error 1 make[1]: ***
> [src/CMakeFiles/main.dir/all] Error 2
> make: *** [all] Error 2

Ответы [ 2 ]

0 голосов
/ 02 июня 2011
tcp::socket *s = 0;

if (mode == A_CONDITION) {
    s = new tcp::socket(io_service);
    s->connect(*iterator);   
}

ки? Не забудьте удалить s позже.

0 голосов
/ 02 июня 2011

Посмотрите на handle_commit() в chat_client.cpp.Если при закрытии соединения возникла ошибка, попытайтесь восстановить соединение.

...