Problem mit der Boost Lib (boost::asio)



  • Nun zuerst einmal meine Source.

    stdafx.h : (Vorkompilierte Header sind ausgestellt.) Ich benutze stdafx.h nur um damit ich nicht in jeden anderen header wie alle includes schreiben muss und define´s..

    #pragma once
    
    // Some Defines
    #define _WIN32_WINNT 0x0403
    
    // Standart libs including
    #include <iostream>
    #include <string>
    
    // usings
    using namespace std;
    

    Nun zum eigentlichen Program (ServerSocket.h):

    #include "../Common/stdafx.h"
    #include <boost/asio.hpp>
    
    class ServerSocket
    {	
    public:
    	bool IsWorking;
    
    private:
    	boost::asio::io_service _service;
    
    	boost::asio::ip::tcp::acceptor _acceptor;
    	boost::asio::ip::tcp::endpoint _endpoint;
    	boost::asio::ip::tcp::socket _socket;
    
    public:
    	ServerSocket(int port);
    	~ServerSocket();
    
    	void Listen(int port);
    
    private:
    	void OnAccept(const boost::system::error_code &ec);
    	void OnReceive(const boost::system::error_code &ec, std::size_t bytes_transferred);
    }
    

    Und hier noch die unfertige definierung von ServerSocket.h (ServerSocket.cpp):

    #include "ServerSocket.h"
    
    ServerSocket::ServerSocket(int port)
    {
    };
    
    ServerSocket::~ServerSocket()
    {
    };
    

    Nun jedoch bekomme ich folgende Compiler Ausgabe:

    1>------ Erstellen gestartet: Projekt: XXXXX, Konfiguration: Debug Win32 ------
    1>  ServerSocket.cpp
    1>c:\users\XXX\boost_1_43_0\boost_1_43_0\boost\asio\detail\win_mutex.hpp(99): error C2039: 'InitializeCriticalSectionAndSpinCount': Ist kein Element von '`global namespace''
    1>c:\users\XXXX\boost_1_43_0\boost_1_43_0\boost\asio\detail\win_mutex.hpp(99): error C3861: "InitializeCriticalSectionAndSpinCount": Bezeichner wurde nicht gefunden.
    1>c:\users\XXXX\documents\visual studio 2010\projects\XXX\XXXX\serversocket.cpp(5): error C2533: 'ServerSocket::{ctor}': Ergebnistyp für Konstruktoren nicht zulässig
    1>c:\users\XXX\documents\visual studio 2010\projects\XXX\XXXXX\serversocket.cpp(5): error C2512: 'boost::asio::basic_socket_acceptor<Protocol>': Kein geeigneter Standardkonstruktor verfügbar
    1>          with
    1>          [
    1>              Protocol=boost::asio::ip::tcp
    1>          ]
    1>c:\users\XXX\documents\visual studio 2010\projects\XXX\XXXXX\serversocket.cpp(5): error C2512: 'boost::asio::basic_stream_socket<Protocol>': Kein geeigneter Standardkonstruktor verfügbar
    1>          with
    1>          [
    1>              Protocol=boost::asio::ip::tcp
    1>          ]
    1>  Code wird generiert...
    1>  Überspringen... (keine relevanten Änderungen gefunden)
    1>  Main.cpp
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    


  • ServerSocket::ServerSocket(int port)
    {
    }/*;*/
    
    ServerSocket::~ServerSocket()
    {
    }/*;*/
    


  • Die Reihenfolge in Zeile 10-14 wird Probleme machen, da der Acceptor als Parameter eine Instanz vom Typ Endpoint erwartet, der Acceptor aber vor dem Endpoint erzeugt wird. Und die implizite Konvertierung lässt sich auch vermeiden, da ein short erwartet wird:

    basic_endpoint(const InternetProtocol& protocol, unsigned short port_num)...
    

    Du aber einen int angibst...

    Noch so Tips anbei, da du eh Boost verwendest:
    -Mach deine Server- und Clientklasse ruhig noncopyable, wird ja denke ich mal eh nur eine Instanz von erzeugt^^
    -Mach aus deinem Acceptor einen scoped_ptr

    Ansonsten:
    Wenn du in dem selben Programm Clienten und Server bereitstellen möchtest, solltest du dir im ctor eine Referenz vom io_service holen. Selbiges gilt für den Clienten, da du sonst 2 Instanzen erzeugst... und ein io_service wurde extra so gebaut, damit man mehrere Objekte daran registrieren kann ;).



  • InitializeCriticalSectionAndSpinCount

    Kanns sein dass du ein uralt Windows SDK hast? Oder noch bestimmte Uralt Windows Versionen targetest?



  • Kóyaánasqatsi schrieb:

    Die Reihenfolge in Zeile 10-14 wird Probleme machen, da der Acceptor als Parameter eine Instanz vom Typ Endpoint erwartet, der Acceptor aber vor dem Endpoint erzeugt wird. Und die implizite Konvertierung lässt sich auch vermeiden, da ein short erwartet wird:

    basic_endpoint(const InternetProtocol& protocol, unsigned short port_num)...
    

    Du aber einen int angibst...

    Noch so Tips anbei, da du eh Boost verwendest:
    -Mach deine Server- und Clientklasse ruhig noncopyable, wird ja denke ich mal eh nur eine Instanz von erzeugt^^
    -Mach aus deinem Acceptor einen scoped_ptr

    Ansonsten:
    Wenn du in dem selben Programm Clienten und Server bereitstellen möchtest, solltest du dir im ctor eine Referenz vom io_service holen. Selbiges gilt für den Clienten, da du sonst 2 Instanzen erzeugst... und ein io_service wurde extra so gebaut, damit man mehrere Objekte daran registrieren kann ;).

    Wollte eigentlich eine ServerSocket Class und eine ClientSocket class machen, soviel ich weiß müsste dann die OnReceive Methode in den ClientSocket hinein, jedoch wollte ich jetzt erstmal so das ganze testen.

    Und die Parameter hatte ich aus einem Tutorial (http://www.highscore.de/cpp/boost/)

    🕶

    hustbaer schrieb:

    InitializeCriticalSectionAndSpinCount

    Kanns sein dass du ein uralt Windows SDK hast? Oder noch bestimmte Uralt Windows Versionen targetest?

    7.1 (Windows 7 SDK für .NET 4.0)



  • JHer0 schrieb:

    Wollte eigentlich eine ServerSocket Class und eine ClientSocket class machen, soviel ich weiß müsste dann die OnReceive Methode in den ClientSocket hinein, jedoch wollte ich jetzt erstmal so das ganze testen.

    Jup ist doch oki 🙂

    Und die Parameter hatte ich aus einem Tutorial (http://www.highscore.de/cpp/boost/)

    Das ist ja nicht falsch, aber verbesserungsfähig :p



  • So neues problem^^:

    #include "../Common/stdafx.h"
    #include <boost/asio.hpp>
    
    using namespace boost::asio;
    
    class ServerSocket
    {	
    public:
    	bool IsWorking;
    
    private:
    	ip::tcp::acceptor _acceptor;
    
    public:
    	ServerSocket(unsigned short port);
    	~ServerSocket();
    
    	void Listen();
    	void Stop();
    
    private:
    	void OnAccept(const boost::system::error_code &ec);
    	void OnReceive(const boost::system::error_code &ec, std::size_t bytes_transferred);
    };
    
    #include "ServerSocket.h"
    
    ServerSocket::ServerSocket(unsigned short port)
    	: _acceptor(boost::asio::io_service(), ip::tcp::endpoint(ip::address_v4::from_string("127.0.0.1"), port))
    {
    }
    
    ServerSocket::~ServerSocket()
    {
    	_acceptor.close();
    }
    
    void ServerSocket::Listen()
    {
    	_acceptor.listen();
    }
    
    void ServerSocket::Stop()
    {
    	_acceptor.close();
    }
    
    void ServerSocket::OnAccept(const boost::system::error_code &ec)
    {
    
    }
    
    void OnReceive(const boost::system::error_code &ec, std::size_t bytes_transferred)
    {
    
    }
    

    Sobald Listen ausgeführt wird, gibt es ein Runtime fehler:

    Eine Ausnahme (erste Chance) bei 0x7687b727 in XXX.exe: Microsoft C++-Ausnahme: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > an Speicherposition 0x0032f398..
    Unbehandelte Ausnahme bei 0x7687b727 in XXX.exe: Microsoft C++-Ausnahme: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > an Speicherposition 0x0032f398..
    Das Programm "[3124] XXX.exe: Systemeigen" wurde mit Code -529697949 (0xe06d7363) beendet.
    

    Das ganze endet hier: (throw_exception.hpp)

    #ifndef BOOST_EXCEPTION_DISABLE
        throw enable_current_exception(enable_error_info(e));
    #else
    


  • #include <boost/asio.hpp>
    
    using namespace boost::asio;
    
    class ServerSocket
    {   
    public:
        bool IsWorking;
    
    private:
    	io_service        IOService;
        ip::tcp::acceptor _acceptor;
    
    public:
        ServerSocket(unsigned short port);
        ~ServerSocket();
    
        void Listen();
        void Stop();
    
    private:
        void OnAccept(const boost::system::error_code &ec);
        void OnReceive(const boost::system::error_code &ec, std::size_t bytes_transferred);
    }; 
    
    ServerSocket::ServerSocket(unsigned short port)
        : IOService(),
    	  _acceptor(IOService, ip::tcp::endpoint(ip::address_v4::from_string("127.0.0.1"), port))
    {
    }
    
    ServerSocket::~ServerSocket()
    {
        _acceptor.close();
    }
    
    void ServerSocket::Listen()
    {
        _acceptor.listen();
    }
    
    void ServerSocket::Stop()
    {
        _acceptor.close();
    }
    
    void ServerSocket::OnAccept(const boost::system::error_code &ec)
    {
    
    }
    
    void ServerSocket::OnReceive(const boost::system::error_code &ec, std::size_t bytes_transferred)
    {
    }
    

Anmelden zum Antworten