Boost.Asio async_write / async_read - программы не взаимодействуют должным образом - PullRequest
0 голосов
/ 13 мая 2010

Добрый день.

Я пытаюсь реализовать логику вопроса - ответа, используя boost :: asio.

На клиенте у меня:

void Send_Message()
{
 ....
 boost::asio::async_write(server_socket, boost::asio::buffer(&Message, sizeof(Message)), boost::bind(&Client::Handle_Write_Message, this, boost::asio::placeholders::error));
 ....
}


void Handle_Write_Message(const boost::system::error_code& error)
{
 ....
 std::cout << "Message was sent.\n";
 ....
 boost::asio::async_read(server_socket_,boost::asio::buffer(&Message, sizeof(Message)), boost::bind(&Client::Handle_Read_Message, this, boost::asio::placeholders::error));
 ....
}

void Handle_Read_Message(const boost::system::error_code& error)
{
 ....
 std::cout << "I have a new message.\n";
 ....
}

И на сервере у меня есть код "той же логики":

void Read_Message()
{
 ....
 boost::asio::async_read(client_socket, boost::asio::buffer(&Message, sizeof(Message)), boost::bind(&Server::Handle_Read_Message, this, boost::asio::placeholders::error));
 ....
}


void Handle_Read_Message(const boost::system::error_code& error)
{
 ....
 std::cout << "I have a new message.\n";
 ....
 boost::asio::async_write(client_socket_,boost::asio::buffer(&Message, sizeof(Message)), boost::bind(&Server::Handle_Write_Message, this, boost::asio::placeholders::error));
 ....
}


void Handle_Write_Message(const boost::system::error_code& error)
{
 ....
 std::cout << "Message was sent back.\n";
 ....
}

Сообщение, это просто структура.

И вывод на клиенте: Message was sent. Вывод на серверэто: I have a new message.

И это все.После этого обе программы все еще работают, но ничего не происходит.Я пытался реализовать код вроде:

if (!error)
{
 ....
}
else
{
 // close sockets and etc.
}

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

Заранее спасибо за любой совет.

Ответы [ 2 ]

0 голосов
/ 13 мая 2010

Я всегда забываю вызывать run () или poll () для моего boost :: asio :: io_service. Вы это называете? Потому что для передачи / получения требуется повышение, которое периодически вызывается.

0 голосов
/ 13 мая 2010

Является ли базовый сокет сокетом Unix или Inet?

Возможно, вы захотите попробовать такой инструмент, как tcpdump или wireshark, чтобы посмотреть обмен между клиентом и сервером.

...