Hey alle, ich bin neu zu Asio und Boost, ich habe versucht, einen TCP-Server & Client zu implementieren, so dass ich eine STD übertragen könnte :: Vektor - aber ich bin bisher gescheitert. Ich finde die Boost-Dokumentation von Asio fehlt (um es milde auszudrücken) und schwer zu verstehen (Englisch ist nicht meine primäre Sprache).Boost :: Asio :: Ip :: Tcp :: Iostream Fragen
In jedem Fall habe ich mir die Iostreams-Beispiele angeschaut und versucht, eine objektorientierte Lösung zu implementieren - aber ich bin gescheitert.
Der Server, der ich in der Lage zu implementieren bin versucht, sollten Verbindungen von mehreren Clients zu akzeptieren (Wie kann ich das tun?)
Der Server hat die std :: vector erhalten sollte,/* etwas tun */und dann an den Client zurückgeben, damit der Client feststellen kann, dass der Server die Daten intakt empfangen hat.
* .h-Datei
class TCP_Server : private boost::noncopyable
{
typedef boost::shared_ptr<TCP_Connection> tcp_conn_pointer;
public :
TCP_Server(ba::io_service &io_service, int port);
virtual ~TCP_Server() {}
virtual void Start_Accept();
private:
virtual void Handle_Accept(const boost::system::error_code& e);
private :
int m_port;
ba::io_service& m_io_service; // IO Service
bi::tcp::acceptor m_acceptor; // TCP Connections acceptor
tcp_conn_pointer m_new_tcp_connection; // New connection pointer
};
* CPP-Datei
TCP_Server::TCP_Server(boost::asio::io_service &io_service, int port) :
m_io_service(io_service),
m_acceptor(io_service, bi::tcp::endpoint(bi::tcp::v4(), port)),
m_new_tcp_connection(TCP_Connection::Create(io_service))
{
m_port = port;
Start_Accept();
}
void TCP_Server::Start_Accept()
{
std::cout << "[TCP_Server][Start_Accept] => Listening on port : " << m_port << std::endl;
//m_acceptor.async_accept(m_new_tcp_connection->Socket(),
// boost::bind(&TCP_Server::Handle_Accept, this,
// ba::placeholders::error));
m_acceptor.async_accept(*m_stream.rdbuf(),
boost::bind(&TCP_Server::Handle_Accept,
this,
ba::placeholders::error));
}
void TCP_Server::Handle_Accept(const boost::system::error_code &e)
{
if(!e)
{
/*boost::thread T(boost::bind(&TCP_Connection::Run, m_new_tcp_connection));
std::cout << "[TCP_Server][Handle_Accept] => Accepting incoming connection. Launching Thread " << std::endl;
m_new_tcp_connection = TCP_Connection::Create(m_io_service);
m_acceptor.async_accept(m_new_tcp_connection->Socket(),
boost::bind(&TCP_Server::Handle_Accept,
this,
ba::placeholders::error));*/
m_stream << "Server Response..." << std::endl;
}
}
Wie sollte der Kunde aussehen? Wie halte ich die Verbindung aufrecht, während beide Apps "sprechen"?
Dieses Codebeispiel (mit der Behebung eines fehlenden ')') kompiliert, aber beim Ausführen eine Ausnahme ausgelöst. Es scheint, dass handle_accept sofort beim Start mit einem Fehler aufgerufen wird. Was ist das Problem? – Marius
Ah, um dieses Beispiel zu beheben, muss 'socket_' wie folgt initialisiert werden: 'socket_ (acceptor.get_io_service())'. Entfernen Sie einfach die 'tcp :: v4()'. – Marius