[C++] Boost.Asio: Klassenfunktionen als Parameter übergeben?!

t0day

Grünschnabel
Moin,
aktuell versuche ich Boost.Asio als Netzwerkschnittstelle zu verwenden. Allerdings gelingt mir das nicht.

Aktueller Code:
Code:
CIcd::CIcd()
{
	sock = new boost::asio::ip::tcp::socket(this->io_service); 
	resolver = new boost::asio::ip::tcp::resolver(this->io_service); 
}

void CIcd::net_connect(std::string server, unsigned int port)
{
	boost::asio::ip::tcp::resolver::query query("localhost", "1234"); 	
	resolver->async_resolve(query, net_resolve); 
	io_service.run(); 
}

Da gibt mir VS 10 dann einen netten Error zurück (für jede der drei Funktionen (net_resolve, net_handleConnect, net_read):
error C3867: "CIcd::resolve_handler": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Cicd::resolve_handler", um einen Zeiger auf den Member zu erstellen.

Gemacht getan. Aber jetzt bekomme ich einen mir unverständlichen Error:

boost\asio\impl\write.hpp(45): error C2228: Links von ".write_some" muss sich eine Klasse/Struktur/Union befinden.

Wenn ich allerdings die net_* (außer net_connect) als Nicht-Klassenmember benutze geht alles, allerdings kann net_read dann nicht in der Klasse weiter verarbeitet werden.

Hat da irgendjemand einen Vorschlag wie sich das Lösen lässt?

t0day
 
Hallo,

für die Funktionszeiger müsstest du 'boost::bind' verwenden:
C++:
resolver->async_resolve(query, boost::bind(&CIcd::net_resolve, this));
Ich weiß nicht, wie die Signatur von 'net_resolve' aussieht (Parameter). Evt. müsste 'boost::bind' daher noch weitere Parameter erhalten.

Gruß
MCoder
 
Danke schonmal für die Hilfe. Das Aufrufen der Funktionen geht jetzt wunderbar. Allerdings kann ich boost::asio::write aus irgendeinem Grund jetzt nicht aufrufen.
Code:
void CIcd::net_connect(const boost::system::error_code &ec) 
{ 
	if (!ec) 
	{ 
		boost::asio::write(sock, boost::asio::buffer("ATTACH User=Testuser\n")); 
		sock->async_read_some(boost::asio::buffer(netbuffer), boost::bind(&CIcd::net_read, this, _1, _2)); 
	} 
}

Da der Fehlerlog recht unübersichtlich und lang ist habe ich den mal auf Pastebin hochgeladen:
http://pastebin.com/kF7vK637

Aus dem Log werde ich irgendwie nicht schlau...
 
Da 'sock' ein Zeiger ist, müsste der Aufruf meines Erachtens so aussehen:
C++:
boost::asio::write( *sock, .... );
Gruß
MCoder
 
Zurück