Boost Asio io_service, чтение сообщений от клиента - PullRequest
1 голос
/ 06 января 2011

Я пытаюсь создать простой Tcp-сервер в C ++ с использованием библиотеки Boost ASio.Я написал два класса TcpConnection и TcpServer.

Мне нужно поведение, состоящее в том, что Tcp-сервер должен иметь возможность отправлять сообщения всем подключенным клиентам, а клиенты должны иметь возможность регистрироваться / отменять регистрацию на сервере.

Мне удалось достичьотправка сообщения с сервера.Я был неудачным с чтением со стороны клиентов.Мой клиент написан на Java, используя apache mina.

Код сервера

message = message + "\r\n"; 
const int bytesToSend = message.length(); 
boost::system::error_code error;
boost::asio::write(socket, boost::asio::buffer(message, bytesToSend), boost::asio::transfer_all(), error);

Код клиента

ConnectFuture future = ioConnector.connect(new InetSocketAddress(Port),
                new TriggerReceiverHandler();
System.out.println("Message Receiver started and listening on port "+ Port);
IoSession session = future.getSession();
session.write(new String("TEst Message From Client"));

На сервере код для чтения сообщений выполнениспользуя async_read

boost::array<char, 1> buf;
    boost::asio::async_read(socket, boost::asio::buffer(buf),
        boost::bind(&TcpConnection::handleRead, this, buf, boost::asio::placeholders::error));


void TcpConnection::handleRead(boost::array<char, 1> buf, const boost::system::error_code& error)
{
    if(!error)
    {
        std::cout << "Message: " << buf.data() << std::endl;
    }
    else
    {
        std::cout << "Error occurred." << std::endl;
    }
}

Но handleRead не вызывается, когда я запускаю сообщение, записывая сеанс от клиента.Пожалуйста, скажите мне, если я делаю что-то не так.

Буду признателен за любую помощь. Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Заранее спасибо.

1 Ответ

1 голос
/ 06 января 2011

Во-первых, это кажется неправильным!

boost::array<char, 1> buf;

Вы объявляете массив размером 1! Я бы предложил что-то большее!

boost::array<char, 1500> buf;

Кроме буфера, я не вижу ничего плохого в вашем коде, просто убедитесь, что вы не чередуете async_read вызовы в одном сокете.

...