Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/37: Рейтинг темы: голосов - 37, средняя оценка - 4.81
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
1

Boost.asio ошибка в socket.connect

09.08.2013, 11:19. Показов 7314. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите почему коннект выдает ошибку?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <QCoreApplication>
#include <boost/asio.hpp>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::socket socket(io_service);
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"),2090);
    boost::system::error_code e;
    socket.connect(endpoint,e);
    if(e){
        std::cerr << "fuck" << "\n";
    }else{
                     std::cerr << "cool" << "\n";
    }
    return a.exec();
}
Добавлено через 41 минуту
немножко переделал

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <QCoreApplication>
#include <boost/asio.hpp>
 
void handler(const boost::system::error_code error)
{
    if(!error){
        std::cerr << "работает" << "\n";
    }else{
        std::cerr << "не работает" << "\n";
    }
}
 
void run_server(){
    boost::asio::ip::tcp::endpoint server_endpoint(boost::asio::ip::tcp::v4(),9999);
    boost::asio::io_service server_io_service;
    boost::asio::ip::tcp::socket server_socket(server_io_service);
    boost::asio::ip::tcp::acceptor server_acceptor(server_io_service,server_endpoint);
}
 
void run_client(){
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::socket socket(io_service);
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"),9999);
    boost::system::error_code ec;
    socket.connect(endpoint,ec);
    if(!ec){
        std::cerr << "работает/n";
    }else{
        std::cerr << ec;
    }
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //server
    run_server();
    run_client();
    std::cerr << "end" << "\n";
    return a.exec();
}
В консоль выводит ошибку System:10061
Это ошибка подключения, т.е. сервер отверг подключение. Где ошибка в коде?

Добавлено через 5 минут
добавил к запуску сервера строчку
C++ (Qt)
1
server_acceptor.accept(server_socket);
но теперь запускается и ничего не пишет. При этом само приложение прекращает действия.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2013, 11:19
Ответы с готовыми решениями:

boost::asio::ip::tcp::socket::async_connect не вызывает handler
Пытаюсь подключиться к серверу: void CTcpClient::Connect( const std::string &amp; IpAddress_, int...

Boost::asio::ip::udp::socket bind а мне нужен не локальный хост
Здравствуйте. Пытаюсь наладить для своих нужд пример #include &lt;iostream&gt; #include &lt;string&gt;...

Ошибка в boost::asio::ip::tcp::iostream stream (&request);
Только приступаю к изучению boost::asio, не судите строго. Программа вычитывает картинку и...

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта...

10
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
09.08.2013, 14:36 2
Когда Вы коннектитесь к серверному сокету, ни этого сокета, ни аксептора уже нет. Вот так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <boost/asio.hpp>
#include <iostream>
 
int main()
{
    boost::asio::io_service io_service;
    
    boost::asio::ip::tcp::endpoint server_endpoint( boost::asio::ip::tcp::v4(), 9999 );
    boost::asio::ip::tcp::socket server_socket( io_service );
    boost::asio::ip::tcp::acceptor server_acceptor( io_service, server_endpoint );
    
    boost::asio::ip::tcp::socket socket( io_service );
    boost::asio::ip::tcp::endpoint endpoint( boost::asio::ip::address::from_string("127.0.0.1"), 9999 );
    
    boost::system::error_code ec;
    socket.connect(endpoint,ec);
    if(!ec)
    {
        std::cerr << "connected" << std::endl;
    }
    else
    {
        std::cerr << ec.message() << std::endl;
    }
    
    return 0;
}
1
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
09.08.2013, 16:01  [ТС] 3
Fyret,
я изменил
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    boost::asio::io_service ios;
    boost::asio::ip::tcp::socket socket(ios);
    boost::asio::ip::tcp::acceptor acceptor(ios);
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(),4455);
    boost::system::error_code ec;
    acceptor.accept(socket,ec);
    if(ec){
        std::cerr << ec << " 1" << std::endl;
    }
    boost::asio::ip::tcp::socket cl_socket(ios);
    boost::asio::ip::tcp::endpoint cl_endpoint(boost::asio::ip::address::from_string("127.0.0.1"),4455);
    ec.clear();
    cl_socket.connect(endpoint,ec);
    if(ec){
        std::cerr << ec << " 2" << std::endl;
    }
    socket.close();
    acceptor.close();
    return a.exec();
}
но выдает две ошибки:
system: 87
system: 10049

Добавлено через 3 минуты
а почему не нужно писать
Цитата Сообщение от korep Посмотреть сообщение
acceptor.accept(socket,ec);
?

Добавлено через 5 минут
И еще вопрос:
если я посылаю данные другому клиенту, я работаю с ним как с сервером? Если я обмениваюсь данными с другим клиентом сервер должен быть и у меня и у него для приема данных, и клиент для отправки. так?
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
09.08.2013, 16:57 4
Так в это случае аксептор не открыт. Либо
C++
1
boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint );
либо
C++
1
2
3
4
boost::asio::ip::tcp::acceptor acceptor(io_service);
acceptor.open(protocol);
acceptor.bind(endpoint);
acceptor.listen();
Почитайте все-таки документацию asio.

Цитата Сообщение от korep Посмотреть сообщение
а почему не нужно писать
Не нужно, если не нужно соединение на стороне сервера. А оно было не нужно, чтобы просто показать, что коннект есть.

Цитата Сообщение от korep Посмотреть сообщение
И еще вопрос:
Клиент - тот, кто начинает соединение. Сервер - тот, кто ждет, что с ним помуг соединиться. Оба они шлют данные. Если оба "клиента" должны быть совершенно равноправными, если каждый из них может инициализировать соединение с другим, то да - у каждого должно быть по серверу и по клиенту.
1
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
09.08.2013, 18:11  [ТС] 5
Fyret, т.е. если данные передавать буду, то тут уже необходимо добавить эту строчку?
Цитата Сообщение от korep Посмотреть сообщение
acceptor.accept(socket,ec);
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
09.08.2013, 18:20 6
Цитата Сообщение от korep Посмотреть сообщение
если данные передавать буду, то тут уже необходимо добавить эту строчку
да, иначе неоткуда/некуда будет данные читать/отправлять на стороне сервера. А так - через этот socket.

И не забывайте, что accept - синхронный метод, бессмысленно использовать его, когда клиент и сервер работают в одном потоке (что само по себе странно).
0
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
09.08.2013, 18:22  [ТС] 7
Fyret, у вас не будет примера асинхронного обмена?
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
09.08.2013, 19:08 8
Цитата Сообщение от korep Посмотреть сообщение
Fyret, у вас не будет примера асинхронного обмена?
Постараюсь найти, но попозже
0
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
09.08.2013, 19:09  [ТС] 9
Fyret, спасибо
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
09.08.2013, 23:17 10
Этот пример ни разу не образец для подражания. Но, думаю, его достаточно для общего представления о том, как асинхронно слать и принимать данные.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/thread.hpp>
 
#include <deque>
#include <iostream>
 
namespace
{
    std::deque< std::string > messagesToSend;
    boost::asio::io_service ioService;
    boost::shared_ptr< boost::asio::io_service::work > work;
}
 
class Server
{
public:
    Server( boost::asio::io_service& ioService )
        : acceptor_( ioService, boost::asio::ip::tcp::endpoint( boost::asio::ip::tcp::v4(), 7001 ) )
        , socket_( ioService )
    {
    }
 
    ~Server()
    {
        stop();
    }
 
    void run()
    {
        acceptor_.async_accept( socket_, boost::bind( &Server::onAccept, this, _1 ) );
    }
    
    void stop()
    {
        if( socket_.is_open() )
        {
            socket_.cancel();
            socket_.close();
        }
        
        socket_.close();
        acceptor_.close();  
    }
 
private:
    void onAccept( const boost::system::error_code& e )
    {
        if( e )
        {
            std::cerr << "Server error on accept: " << e.message() << std::endl;
            return;
        }
        socket_.async_read_some( boost::asio::buffer( buffer_, 512 ), boost::bind( &Server::onRead, this, _1, _2 ) );
    }
 
    void onRead( const boost::system::error_code& e, std::size_t bytesTransferred )
    {
        if( bytesTransferred )
        {
            std::cout << "Server got msg: " << std::string( buffer_, bytesTransferred ) << std::endl;
        }
        if( e )
        {
            std::cerr << "Server error on read: " << e.message() << std::endl;
            return;
        }
        
        boost::this_thread::sleep( boost::posix_time::milliseconds(100) );
        
        socket_.async_read_some( boost::asio::buffer( buffer_, 512 ), boost::bind( &Server::onRead, this, _1, _2 ) );
    }
 
private:
    boost::asio::ip::tcp::acceptor acceptor_;
    boost::asio::ip::tcp::socket socket_;
 
    char buffer_[512];
};
 
class Client
{
public:
    Client( boost::asio::io_service& ioService )
        : socket_( ioService )
    {
    }
 
    ~Client()
    {
        if( socket_.is_open() )
        {
            socket_.cancel();
            socket_.close();
        }
    }
 
    void run()
    {
        socket_.async_connect( boost::asio::ip::tcp::endpoint( boost::asio::ip::address::from_string("127.0.0.1"), 7001 ),
                               boost::bind( &Client::onConnect, this, _1 ) );
    }
 
private:
    void onConnect( const boost::system::error_code& e )
    {
        if( e )
        {
            std::cerr << "Client error on connect: " << e.message() << std::endl;
            return;
        }
        if( messagesToSend.empty() )
        {
            std::cerr << "Client has nothing to send" << std::endl;
        }
        
        std::cout << "Clent sending message: " << messagesToSend[0] << std::endl;
        
        boost::asio::async_write( socket_,
                                  boost::asio::buffer( messagesToSend[0].data(), messagesToSend[0].size() ),
                                  boost::bind( &Client::onWrite, this, _1, _2, 1 ) );
    }
 
    void onWrite( const boost::system::error_code& e, std::size_t bytesTransferred, int messageNumber )
    {
        if( e )
        {
            std::cerr << "Client error on write: " << e.message() << std::endl;
            return;
        }
        if( messageNumber >= messagesToSend.size() )
        {
            std::cout << "Client has sent all messages" << std::endl;
            return;
        }
        
        boost::this_thread::sleep( boost::posix_time::milliseconds(300) );
        std::cout << "Clent sending message: " << messagesToSend[messageNumber] << std::endl;
        
        boost::asio::async_write( socket_,
                                  boost::asio::buffer( messagesToSend[messageNumber].data(), messagesToSend[messageNumber].size() ),
                                  boost::bind( &Client::onWrite, this, _1, _2, messageNumber+1 ) );
    }
 
private:
    boost::asio::ip::tcp::socket socket_;
};
 
int main()
{
    messagesToSend.push_back( "First Message ");
    messagesToSend.push_back( "Second Message ");
    
    work.reset( new boost::asio::io_service::work( ioService ) );
    
    boost::thread thread( boost::bind( &boost::asio::io_service::run, &ioService ) );
 
    Server server( ioService );
    server.run();
    
    Client client( ioService );
    client.run();
 
    boost::this_thread::sleep( boost::posix_time::seconds(1) );
    
    server.stop();
    work.reset();
    thread.join();
 
    return 0;
}
1
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
10.08.2013, 09:45  [ТС] 11
Fyret, спасибо.
0
10.08.2013, 09:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2013, 09:45
Помогаю со студенческими работами здесь

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда...

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

Boost asio + qt (slots)
Здравствуйте! В общем, имеется клиентский код из документации boost::asio (&lt;ТЫК&gt;) Он у меня...

boost::asio cессии
Здравствуйте. Хотелось бы узнать ответ на вопрос, который не где не нашол. Сервер реализован на...

Boost.Asio не соединяется
Здравствуйте форумчане, недавно начал изучать boost.asio Скомпилил из примеров Server Client,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru