didida schrieb:
Aber: Die Anwendung erwartet auch Tasten wie F1-12, Pg Up, kurz alle Tasten der Tastatur. Wie kann ich diese nun an die Anwendung schicken?
dumpkeys gibt dir Auskunft über die Keycodes, die das Programm erwartet. :3
Ich weiß nicht, ob man auf die Steuerelemente eines anderen Fensters zugreifen kann (und wenn ja ist das vom Toolkit abhängig), aber man kann mit Hilfe der Xlib oder xcb auf andere Fenster zugreifen. Um zunächst einmal eine Liste der Fenster zu erhalten, kannst du folgendes versuchen:
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <limits>
#include <xcb/xcb.h>
#include <xcb/xcb_atom.h>
int main()
{
int screen_num = 0;
xcb_connection_t *con = xcb_connect(NULL, &screen_num);
if(!con)
{
std::cerr << "Cannot connect to the X server." << std::endl;
exit(1);
}
xcb_screen_t *screen;
for(xcb_screen_iterator_t it = xcb_setup_roots_iterator(xcb_get_setup(con));
it.rem; screen_num--, xcb_screen_next(&it))
if(!screen_num) screen = it.data;
xcb_atom_t NET_CLIENT_LIST = xcb_atom_get(con, "_NET_CLIENT_LIST");
xcb_get_property_cookie_t cookie =
xcb_get_property(con, 0, screen->root, NET_CLIENT_LIST, WINDOW, 0,
std::numeric_limits<uint32_t>::max());
xcb_generic_error_t *error;
xcb_get_property_reply_t *reply =
xcb_get_property_reply(con, cookie, &error);
if(error)
{
std::cerr << "Could not get client list." << std::endl;
exit(1);
}
xcb_window_t *clients =
static_cast<xcb_window_t*>(xcb_get_property_value(reply));
for(int c = 0; c < reply->length; c++)
std::cout << "0x" << std::setfill('0') << std::setw(8) << std::hex
<< clients[c] << (c == reply->length - 1 ? "." : ", ");
std::cout << std::endl;
free(reply);
xcb_disconnect(con);
return 0;
}
Erst einmal Danke für den Hinweis auf das Programm. So ganz funktioniert das allerdings nicht. Möglicherweise habe ich es falsch bedient oder die Switches erfüllen nicht alle Voraussetzungen - ist aber jetzt auch nicht so wichtig.
Denn eigentlich müsste ich das sowieso in einem C++ Programm machen. Im Endefekt sollte dabei ein Layer 2 traceroute als Ergebnis herauskommen. Allerdings sehe ich hierfür auf Layer2 keine Möglichkeiten. Wenn eine Art TTL Feld existieren würde, und jeder Switch das runterzählt und ggf eine Fehlermeldung zurückschickt, wie eben bei traceroute, dann ging das ja. Aber einen derartigen Mechnismus, welcher layer 2 traceroute ermöglichen würde, sehe ich nicht.
Habe ich jetzt was außer Acht gelassen, oder ist das leider so?
Du solltest Dir wirklich irgendein Buch zu den Grundlagen von C holen. Matlab spuckt Dir eine Funktion aus, die Du in einem C-Programm aufrufen kannst.
Das C-Programm braucht natürlich eine main-Funktion und das Programm kompilierst Du dann. Die Binary, die Dir der Compiler ausspuckst, kannst Du aufrufen.
Hallo!
Bitte in dem Fall, local >= local3 nehmen, da local0 usw. vom System verwendet werden.
Wenn du den System-Logger verwenden willst, musst /etc/syslog.conf anpassen.
Hier ein Beispiel mit local3:
#local3.* leitet alle Ausgaben in die eine Datei
local3.* /mein/ordner/logdatei.log
#kann aber auch so aussehen > Hier ausführlicher <
local3.info /mein/ordner/logdatei.log.inf
local3.debug /mein/ordner/logdatei.log.dbg
local3.error /mein/ordner/logdatei.log.error
local3.warninig /mein/ordner/logdatei.log.warning
local3.notice /mein/ordner/logdatei.log.notice
Jetzt muss der Logger neu gestartet werden:
ich glaub sollte so funktionieren.
cd /etc/init.d/
./syslog restart
Gruß
Bayram
Hi,
leder reicht es einfach nicht aus, mit setlocale zu arbeiten!
Dabei musst du drauf achten, dass die Sprache (Umgebungsvariable) richtig gesetzt ist.
setenv("LANG","de_DE",1); //lang is now de_DE
setlocale(LC_MESSAGES,"");
//text domain = /dein/ordner/sprachen/
bindtextdomain( "messages", BIND_TEXT_DOMAIN );
// das *.mo-File nach /dein/ordner/sprachen/de_DE/LC_MESSAGES/ kopieren.
//use the for the translation-MO's
textdomain( "messages" );
Schöne Grüße
2.6.22 schrieb:
Applications can use an eventfd file descriptor instead of a pipe (see pipe(2)) in all cases where a pipe is used simply to signal events. The kernel overhead of an eventfd file descriptor is much lower than that of a pipe, and only one file descriptor is required (versus the two required for a pipe).
Oh danke. Man lernt immer was dazu.
man: eventfd(2)
Hallo Leute,
ich habe einen Multicast-fähigen Sender und einen Empfänger mithilfe von Boost.Asio programmiert und teste gerade verschiedene Use-Cases auf Linux und auf Mac OSX.
Dabei ist mir aufgefallen, dass sich Linux und OSX beim Verlust der Netzwerkverbindung (Kabel abziehen) grundsätzlich unterschiedlich verhalten.
Und zwar bekomme ich beim Verlust der Netzwerkverbindung beim send_to() unter Linux einen Fehler zurück: Asio meldet "Network is unreachable".
Unter OSX hingegen bekomme ich überhaupt keinen Fehler. send_to() gibt weiterhin die korrekte Anzahl von bytes als geschrieben zurück.
Wenn ich das Netzwerkkabel dann wieder dranstecke, fängt Linux an, wieder fröhlich weiterzusenden, sobald es eine IP-Adresse hat.
Bei OSX hingegen kommt dann (und zwar erst, wenn das Netzwerkkabel steckt!) ein Fehler "Network is unreachable" so lange, bis er wieder einen DHCP-Lease hat. Sobald die IP-Adresse dann gesetzt ist, sendet auch OSX wieder fröhlich weiter.
Was mir noch aufgefallen ist: Der Empfänger ist auf INADRR_ANY gebindet (bevor das joingroup gemacht wird). Unter Linux empfängt er im Falle des abgesteckten Netzwerkkabels weiterhin die abgesetzten Pakete über den Loopback-Adapter. Unter OSX tut er das nicht, da empfängt er garnix (während der Sender KEINEN FEHLER meldet).
Ist jemand in Sachen Netzwerkprogrammierung unter OSX so bewandert, dass er mir erklären kann, warum es sich so grundlegend anders verhält?
Gruß,
Phil
Halte dich am besten an die Standardvariablennamen von Make $(CXX) $(CPPFLAGS) $(CXXFLAGS). Aber schau dir vielleicht mal eine saubere Makefile an. Die hier aus dem Forum kann sogar Dependencytracking machen http://www.c-plusplus.net/forum/viewtopic-var-t-is-88418.html
Und -Wextra und -W sind übrigens das gleiche (-Wextra ist die neuere Variante). Du kannst also das -W aus deinen Flags nehmen.
(Ich würde aber eher darauf verzichten eigene Makefiles zu frickeln. Nimm doch lieber CMake oder so)
nman schrieb:
Zur Authentifizierung kannst Du http://code.google.com/p/mod-auth-external/ oä. verwenden, das lässt Du gegen PAM fahren, dann braucht Dein Webtool schonmal keinen Zugriff auf /etc/shadow mehr.
Die .procmail .forward etc. aller User machst Du schreibbar für eine Gruppe, der Dein Tool angehört und zugleich schränkst Du den Zugriff auf Dateien mit Besitzer x noch auf den authentifizierten Benutzer x ein.
Damit hast Du schon etwas deutlich sichereres, als Deinen alten Entwurf.
Das klingt nicht schlecht. Ist zwar nicht ganz so eine simple Lösung, die ich mir gewünscht hätte, aber ein durchaus gangbarer Weg. Danke.
mfg Martin
Es gibt verschiedene Lösungen um mehrere Verbindungen mit einem Server zu behandeln. Prinzipiell kannst du zB Threads oder Prozesse nutzen. Ein Prozess wartet auf accept und startet für neue Verbindungen einen eigenen Prozess/Thread um die Verbindung zu behandeln. Alternativ gibt es die Möglichkeit mit man: select(2) (wobei es dafür mittlerweile bessere APIs gibt, die aber Systemabhängig sind: man: epoll für Linux und man: kqueue für BSD/OSX und noch andere Sachen. libevent ist zB ein Wrapper für die ganzen Geschichten) zu überprüfen auf welchen sockets Ereignisse (Daten zum lesen, Möglichkeit zum schreiben, Fehler) warten. Daneben gibt es noch andere async bzw. Mischmethoden.
Wenn du C++ benutzt, lohnt sich sicher ein Blick in boost::asio. Dabei handelt es sich um eine Bibliothek, die die ganzen Netzwerkgeschichten schön verpackt.
Etwas wie unbind gibt es nicht. Da bleibt dir nur übrig das Socket zu schließen und dann ein neues zu öffnen.
Hallo und danke noch einmal für deine Hilfe.
Mit XSendEvent() hat sich gleich verhalten.
Ich habe herausgefunden, dass ich nach dem KeyDown nicht sofort keyUp aufrufen darf. Wenn ich KeyDown für eine bestimmte Zeit ausführe, funktionieren auch die anderen Anwendungen.
Ich denke, die Events kommen zu schnell hintereinander und die Anwendung führt nur den letzten aus...
while(/*...*/){
/*...*/
if(m_iKeyDownDuration-- > 0){
XTestFakeKeyEvent(display, keycode, True, 0);
} else {
XTestFakeKeyEvent(display, keycode, False, 0);
}
XFlush(display);
/*...*/
}