Domainsocket mit boost::asio geht nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Domainsocket mit boost::asio geht nicht

Beitrag von alexander_ro » 06.05.2010 10:16:09

Hallo,

ich habe gerade ein Problem mit einem kleinen Testprogramm (C++) das boost::asio benutzt. Das habe ich vor einiger Zeit geschrieben und bin mir sicher das es funktioniert hat. Das tut es jetzt leider nicht mehr. Beim starten bekomme ich die vielsagende Meldung: "Operation not permitted".

So sieht der Server Teil aus und er soll einfach Daten über einen Domainsocket zu einem anderen Prozess übertragen.

Code: Alles auswählen

  try
  {
    boost::asio::io_service io_service;

  // Server für Domainsocket
    std::remove ("./Client");
    boost::asio::local::stream_protocol::endpoint ep ("./Client");
    boost::asio::local::stream_protocol::acceptor acceptor (io_service, ep);  // <= Diese Zeile löst die Exception aus.
  //  boost::asio::local::stream_protocol::socket socket (io_service);
  //  acceptor.accept (socket);
  //     
  //  for (;;)
  //  {
  //    std::string message = "Alexander\n";
  //    boost::system::error_code ignored_error;
  //    boost::asio::write (socket,
  //                        boost::asio::buffer (message),
  //                        boost::asio::transfer_all (),
  //                        ignored_error);
  //  }
  }
  catch (std::exception &e)
  {
    std::cerr << "Irgendwas geht nicht: " << e.what () << std::endl;
  }
Benutzen tu ich ein Lenny mit den Boost Paketen aus Testing. Gestartet habe ich es als root dann sollte es auch kein Problem mit den rechten sein.
Wäre schön wenn jemand einen Tipp hätte im Moment fehlt mir die richtige Idee :(

Grüße
Alexander
Zuletzt geändert von alexander_ro am 07.05.2010 11:20:30, insgesamt 1-mal geändert.

Benutzeravatar
schorsch_76
Beiträge: 2612
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Domainsocket mit boost::asio geht nicht

Beitrag von schorsch_76 » 06.05.2010 21:50:11

Hallo Alexander,

leider kann ich mit deinem minimalen C++ Code nichts anfangen. Könntest du ein auf dein Problem reduziertes kompilierbares Beispiel posten?

Gruß

schorsch

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Domainsocket mit boost::asio geht nicht

Beitrag von alexander_ro » 07.05.2010 10:29:21

Hallo Schorsch,

recht viel minimaler gehts nicht.
Im Beispiel oben habe ich die Zeilen auskommentiert bis zu der die für die Exception verantwortlich ist.
Damit man sich tatsächlich mit den Socket verbinden kann muß man die Kommentare entfernen.
Der Compiler mekert aber auch nicht wenn man das nicht macht.
Mit einem Kommentar im Listing habe ich die Zeile die Probleme macht markiert.

Fertig sieht dann so aus:

Code: Alles auswählen

#include <iostream>
#include <string>
#include <boost/asio.hpp>

main (void)
{
  try
  {
    boost::asio::io_service io_service;

  // Server für Domainsocket
    std::remove ("./Client");
    boost::asio::local::stream_protocol::endpoint ep ("./Client");
    boost::asio::local::stream_protocol::acceptor acceptor (io_service, ep);   //<= Hier wird die Exception ausgelöst.
 
// Der Teil ab hier legt den Socket fertig an und lauscht dann nach jemanden der eine Verbindung aufbauen will.
// Wird eine Verbindung aufgebaut wird der String in der Schleife gesendet.
    boost::asio::local::stream_protocol::socket socket (io_service);
    acceptor.accept (socket);

    for (;;)
    {
      std::string message = "Alexander\n";
      boost::system::error_code ignored_error;
      boost::asio::write (socket,
                          boost::asio::buffer (message),
                          boost::asio::transfer_all (),
                          ignored_error);
    }
  }
  catch (std::exception &e)
  {
    std::cerr << "Irgendwas geht nicht: " << e.what () << std::endl;
  }

  return (0);
}
Grüße
Alexander

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Domainsocket mit boost::asio geht nicht

Beitrag von alexander_ro » 07.05.2010 11:31:55

Jetzt hab ich den Fehler gefunden.
Es liegt scheinbar daran das ich das Filesystem mit sshfs gemountet habe.
Das hatte ich ganz vergessen liegt schon ein paar Monate zurück der mount.
Warum das allerdings dann nicht geht weiss ich nicht, scheinbar lassen sich solche Spezialdateien nicht per sshfs anlegen.

Alexander

Antworten