Я пишу простой класс сокетов. Я пытаюсь написать сокет в соответствии с примером 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:";
}
}
А также добавьте t.join(). – kometen
Спасибо! Теперь это работает! –