Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

18.04.2014, 11:57

Sync Tool?

Hallo,

was würde sich für ein Synchronisierungs Tool anbieten?
Ich würde gerne mehrere Ordner von einem Server aus an beliebig viele Clients verteilen. Der Client soll dabei nur eine Art Launcher starten die dann nach Updates sucht und dementsprechend aktualisiert.
Der Server läuft auf Linux, die Clients auf Windows.

Ein Kumpel hatte Sync von BitTorrent vorgeschlagen.
Außerdem habe ich noch csync gefunden.

Den Client würde ich am liebsten in GTK+ bauen.
Hat jemand Erfahrung mit den beiden Programmen oder etwas besseres? Das Ganze sollte nicht zu aufwendig werden...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

19.04.2014, 20:22

Hmm ist irgendwie alles ungeeignet für das was ich will.

Darum versuche ichs gerade in asio zu schreiben. Aber irgendwie verstehe ich noch nicht so ganz wie das funktioniert.
Z.B. wird der "accept" Handler hier nie aufgerufen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(int argc, char** args){
    try{
        std::cout<<"Starting server."<<std::endl;

        // start server
        boost::asio::io_service io;
        tcp::endpoint endpoints(tcp::v4(), 4321);

        auto server = std::shared_ptr<Server>(new Server(io, endpoints));
        io.run();

        std::cout<<"Server started. Type \"help\" to view commands."<<std::endl;

        // start command acceptor
        auto cmd = std::unique_ptr<Cmd>(new Cmd(server));
    }
    catch(std::exception &e){
        std::cerr<<e.what()<<std::endl;
        return 1;
    }

    return 0;
}


Der Server macht dann das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Server::Server(boost::asio::io_service &io, const tcp::endpoint &endpoints):socket(io), acceptor(io, endpoints){
    running = true;

    thread = std::thread(&Server::run, this);
}

Server::~Server(){
    thread.join();
}

void Server::run(){
    while(running){
        try{
            auto client = std::shared_ptr<Client>(new Client(acceptor.get_io_service()));
            acceptor.async_accept(client->socket, boost::bind(&Server::accept, this));
        }
        catch(std::exception &e){
            std::cerr<<e.what()<<std::endl;
        }
    }
}

void Server::accept(){
    std::cout<<"new client"<<std::endl;
}

void Server::stop(){
    running = false;
}


Der Client ist quasi nur ein socket.
Vorhin hats einmal geklappt (Text wurde ausgegeben), aber ich denke das war Zufall, weil der thread einmal etwas langsam war.
Wobei ich den io_service ja erst nach dem Server starte.

Jemand die Lösung?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

20.04.2014, 01:45

Ah endlich etwas das in die richtige Richtung geht.
Ich gucks mir "morgen" genauer an ;)

Danke schon mal.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

24.04.2014, 21:56

Ich hab mich übrigens doch dafür entschieden es selbst zu schreiben weil ich fürchte dass ich asio noch mal brauchen werde...
Es funktioniert auch soweit, bis auf eine Kleinigkeit. Und zwar ruft async_read nicht seinen Handler auf wenn die Datei zu ende ist.

Auf der Server Seite mache ich das (Datei ist offen und alles wunderbar):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Client::send(const boost::system::error_code &error, const std::size_t bytes){
    if(!error){
        if(!file.eof()){
            file.read(buffer, 512);
            boost::asio::async_write(socket, boost::asio::buffer(buffer, file.gcount()), boost::bind(&Client::send, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
        }
        else{
            std::cout<<"File send."<<std::endl; // passiert auch

            file.close();
            read();
        }
    }
    else if(error == boost::asio::error::eof){
        if(connected){
            disconnect();
        }

        return;
    }
    else{
        read();
    }
}


Auf der Client Seite das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void FileClient::download(){
    boost::asio::async_read(socket, boost::asio::buffer(buffer), boost::bind(&FileClient::handleDownload, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void FileClient::handleDownload(const boost::system::error_code &error, std::size_t bytes){
    if(!error){
        file.write(buffer, bytes);
        download();

        return;
    }
    else if(error == boost::asio::error::eof){
        file.write(buffer, bytes);
        file.close();
    }
    else{
        file.close();
    }

    requests.pop();
    downloading = false;
    request();
}


Wie bekomme ich es hin das der Client es mitbekommt wenn die Datei gesendet wurde?
Momentan funktioniert es nur wenn ich den socket schließe.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

5

24.04.2014, 22:51

Unabhängig von deiner letzten Frage, aber kennst du ZeroMQ? Eventuell ist dies ja etwas für dich und entbindet dich von boost::asio.

ZeroMQ : Wikipedia ZeroMQ
:love: := Go;

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

24.04.2014, 23:39

Nee aber sieht gut aus :)
Hach, wenn ich mal wieder Lust habe was zu lernen guck ich mir das genauer an.

Gerade gehts wenn ich die Dateigröße übertrage ;)

Werbeanzeige

Ähnliche Themen