2016-04-07 5 views
0

Я пишу простой класс сокетов. Я пытаюсь написать сокет в соответствии с примером http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_client.cppboost asio подключен, но не может отправить сообщение

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

(Это неполный класс, потому что я остановился на этой описанной проблеме)

Ioservice определяются вне класса (основной)

#include <iostream> 
#include <thread> 
#include <boost/thread/thread.hpp> 
#include "TCP/TCPSocket.h" 

using namespace std; 

int main() 
{ 
    Traces::SetTraceFolder("trace"); 

    boost::asio::io_service io_service; 
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 



    TCPSocket socket("192.168.0.7", "6000", io_service); 

    char *c = new char[100]; 


    while (true) { 

     std::cin >> *c; 
     socket.WriteMessage(c); 

    } 

    delete [] c; 
    return 0; 
} 

Моего класса:

включает "TCPSocket.h"

TCPSocket::TCPSocket(const std::string &adress, const std::string &port, boost::asio::io_service & serviceio) 
        : io_service(serviceio), 
         socket_(io_service), 
         resolver(io_service) 

{ 
Traces() << "\n" << "LOG: TCPSocket::TCPSocket(const std::string &adress, const std::string &port)"; 


tcp::resolver::query query(adress, port); 
querywsk = new tcp::resolver::query(" ", " "); 



*querywsk = query; 
iterator = resolver.resolve(*querywsk); 

    boost::asio::async_connect(socket_, iterator, 
     boost::bind(&TCPSocket::HandleConnect, this, 
     boost::asio::placeholders::error)); 

} 

void TCPSocket::HandleConnect(const boost::system::error_code& error) 
{ 
    Traces() << "\n" << "LOG: void TCPSocket::HandleConnect(const boost::system::error_code& error)"; 

    if (!error) 
    { 
    boost::asio::async_read(socket_, 
     boost::asio::buffer(data, std::strlen(data)), 
     boost::bind(&TCPSocket::HandleConnect, this, 
      boost::asio::placeholders::error)); 
    } else 
    { 
     Traces() << "\n" << "ERR:"; 
    } 
} 


void TCPSocket::WriteMessage(char *dataToSend) 
{ 
    io_service.post(boost::bind(&TCPSocket::Write, this, dataToSend)); 
} 

void TCPSocket::Write(char *dataToSend) 
{ 
    Traces() << "\n" << "LOG: void TCPSocket::Write(char *dataToSend)"; 

    data = dataToSend; 

    boost::asio::async_write(socket_, 
     boost::asio::buffer(data, std::strlen(data)), 
     boost::bind(&TCPSocket::HandleWrite, this, 
      boost::asio::placeholders::error)); 

} 

void TCPSocket::HandleWrite(const boost::system::error_code& error) 
{ 
    Traces() << "\n" << "LOG: void TCPSocket::HandleWrite(const boost::system::error_code& error)"; 

    if (!error) 
    { 

     boost::asio::async_write(socket_, 
      boost::asio::buffer(data, 
      100), 
      boost::bind(&TCPSocket::HandleWrite, this, 
      boost::asio::placeholders::error)); 
    } 
    else 
    { 
     Traces() << "\n" << "ERR:"; 
    } 
} 

ответ

2
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 

На этом раннем этапе вашего кода io_service не имеет работы.

Итак, поток запускается, io_service запускается в потоке, видит, что делать нечего и поэтому останавливается немедленно.

Таким образом, ничего не происходит.

Вы должны запустить io_service ПОСЛЕ того, как вы настроили работу.


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

Я предлагаю вам начать работу с помощью примеров уроков по адресу http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/tutorial.html После того, как вы проработали свой путь, вы получите гораздо лучшее представление о том, что происходит.

+0

А также добавьте t.join(). – kometen

+0

Спасибо! Теперь это работает! –

Смежные вопросы