hallo,
ich habe mir die libevent als tar.gz heruntergeladen und wollte sie nun unter freeBSD installieren.
./configure LÄUFT
make LÄUFT
make install LÄUFT
unter ubuntu musste ich nun noch etwas in /etc/ld.so.conf.d anlegen und ldconfig ausführen und die sache war gegessen.
unter freebsd scheint es irgendwie anderes zu sein, aber ich kenne mich mit BSD Nüsse aus.
Danke für jede Hilfe
Noq
Hi ihr!
Erstmal vielen Dank für eure Rückmeldungen!
Dann bin ich beruhigt. Ganz so hab ichs nicht gemacht:
Threadlösung: Da das Schreiben und Lesen von Daten einige Zeit in Anspruch nimmt, die der Server nicht zum Rechnen benutzen kann, arbeitet der Chat zwar schon parallel mit Threads, aber er arbeitet pro Thread mehrere Aufgaben hintereinander ab. D.h., jede Aufgabe (Lesen, Schreiben usw.) bekommt eine bestimmte Rechenzeit "zugeteilt" und jeder Thread nimmt dann eine maximale Anzahl an Aufgaben ab, die er hintereinander abarbeitet.
Prozesslösung: Klar, Chats, die pro User einen Prozess (vielleicht noch mit ständiger Zeilenabfrage über eine Datenbank) am Laufen haben, zwingt einen Server schon nach 200-300 Usern in die Knie. Ich dachte, wenn, eher an eine Lösung, in der die einzelnen Prozesse jeweils eine ganze Anzahl an Usern bedienen und ein zentraler Serverprozess wie eine Datenbank Daten/Anfragen der anderen Prozesse annimmt und die Daten schließlich an die Prozesse ausgibt, die sie an die User weitergeben.
Wenn aber ein Prozess schon ausreicht, um einen performanten Chat herzustellen, der mit tausenden Verbindungen klarkommt, dann kann ich mir die Mühe vorerst sparen :-).
Viele Grüße,
Marc
joghurt schrieb:
Ja genau.
Ich möchte auf diese zwei Pipes aber über einen File-Deskriptor zugreifen.
Warum das denn? Wo ist das Problem mit zwei File-Deskriptoren.
Aber du kannst dir mal Unix-Sockets anschauen.
Aber dann wird ja pro request ein thread gestartet. Dann könnte ich wieder getreqset() in die Abfragen mitreinziehen. Aber soll pro Connect bzw. pro Client ein Thread gestartet werden.
Weißt du wo ich da den Fehler habe?!
Hallo Zusammen,
hier die Lösung des Problems.
Der richtige Init:
if ((fd = open(TERM_DEVICE, O_RDWR | O_NOCTTY )) == -1)
{
perror("terminal: Can't open device " TERM_DEVICE);
return(1);
}
/* configurare RS232 */
if (tcgetattr(fd, &term_attr) != 0)
{
perror("terminal: tcgetattr() failed");
return(1);
}
/* save old flags */
old_flags = term_attr.c_lflag;
cfsetispeed(&term_attr, TERM_SPEED);
cfsetospeed(&term_attr, TERM_SPEED);
cfmakeraw(&term_attr);
term_attr.c_cc[VMIN] = 1; // finished after one bye
term_attr.c_cc[VTIME] = 8; // or 800ms time out
term_attr.c_cflag |= CRTSCTS; // using flow control via CTS/RTS
if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
{
perror("terminal: tcsetattr() failed");
return(1);
}
/* change standard input */
if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
{
perror("terminal: tcgetattr() failed");
return(1);
}
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
perror("terminal: tcsetattr() failed");
FD_SET(fd, &input_fdset); /* Select the first channel 1 */
return 0;
Und eine andere Leseroutine, da der Read laut 'term_attr.c_cc[VMIN] = 1; ' nach jedem Zeichen beendet wird.
int tty_read(int filedesc,unsigned char *databuffer,int maxdatasize)
{
int state=1;
int receivedbyte=0;
while( state > 0 && receivedbyte < maxdatasize)
{
state =read(filedesc,&databuffer[receivedbyte],1);
if( state > 0 )
receivedbyte++;
}
return receivedbyte;
}
Hier waren die Fehler, O_NOCTTY fehlte:
(fd = open(TERM_DEVICE, [b]O_RDWR | O_NOCTTY[/b] ))
Falsche min. Anzahl zu lesende Zeichen und Timeout fehlten komplett
term_attr.c_cc[VMIN] = 1; // finished after one bye
term_attr.c_cc[VTIME] = 8; // or 800ms time out
Dann klappt es auch mit dem Nachbarn.
Der Datentyp sollte unsigned char sein !
Gruss
Aus deiner Beschreibung erschließt sich mir noch nicht ganz, warum OSS für dich die beste Variante sein sollte.
Womit möchtest du denn kompatibel sein? Unter Linux kannst du inzwischen eigentlich davon ausgehen, daß ALSA vorhanden sind. OSS hilft dir nur unter einigen anderen Unix-Systemen (BSD, Solaris). Und wenn dein Code irgendwann auch mal unter ganz anderen Systemen laufen soll (OS X, Windows...) wärst du mit einem plattformunabhängigeren (High-Level-)API besser bedient.
Der sollte natürlich die Pipe versorgen können.
(TCP/IP Server Funktionen)
So kenne ich das jedenfalls nur.
Auf den ersten Blick (google named pipe)
http://en.allexperts.com/q/C-1040/C-inter-program-communication.htm
Gruss
Hmm du hast recht das die lib nicht richtig angegeben ist, wenn ich ein Example mit g++ compiliere funktioniert es.
Ich habe in dem Projekt Ordner von QT 3 Makefiles: Makefile, Makefile.Release und Makefile.Debug und in allen haben ich bei LIBS -ljsw angegeben aber irgendwie scheint er das nicht zu nehmen. Also stellt sich die Frage wie man bei QT Creator eine lib angegeben kann. Aber das werde ich noch mal in dem IDE Forum posten.
Danke erstmal
Gruß schirrmie
dgrat schrieb:
naja mein ziel war halt irgendwie auf solche pathangaben zu verzichten.
wie willst auf etwas verzichten, was ein Bestandteil des gesamten Pfades ist? Es ist als würdest du fragen, wie man auf einen Zettel ohne Stift schreiben kann, oder als ob du fragen würdest, wie man auf einem Briefumschlag deine Hausadresse nur duch die Hausnummer beschreibt, ohne Strassennamen, ohne Stadtnamen und ohne Postleitzahl.
dgrat schrieb:
aber selbst PWD braucht eine offene shell, damit der aktuelle path des benutzeres ausgegeben wird.
jetzt muss du erklären, was du damit meinst.
maus_on_c schrieb:
Kann mir jemand erklären warum der Seg.Fault erst nach Verlassen der Funktion auftritt und nicht schon bei der Verarbeitung von der scanf-Anweisung.
Kurz: Undefiniertes Verhalten.
Lang: Vermutlich braucht die Laufzeit nach Verlassen der main noch irgendwas, was auf dem Stack hinter hexvalue liegt. Du hast mit dem scanf n=(sizeof int - sizeof short) Bytes hinter hexvalue "zerstört".
Woran kann ich mich orientieren?
Am POSIX-Standard. Aber wenn du komplett Qt benutzt, solltest du eh keine Probleme haben.
Wenn nicht, wo finde ich entsprechende API's, C/C++ Quellcode?
In den Manpages und auf den Seiten der Hersteller
http://www.gnu.org/software/libc/manual/html_node/index.html
http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/
http://developers.sun.com/solaris/
etc
daersc schrieb:
Gibt es diesen Header nicht unter GNU?
Nein - das ist eine Win-Spezialitaet.
Edit: Die Libiconv macht aehnliches - vielleicht schreibst Du ein Interface in Tchar-Fkt.
http://www.gnu.org/software/libiconv/
... sehr kurze Antwort, aber hey es läuft soweit. Danke.
Ist gut zu wissen, das es Leute gibt die mann fragen kann, ohne gleich doof angemacht zu werden
habe den Fehler:
if (bind (create_socket,(struct sockaddr &address, sizeof (address) !=0))
zu
if (bind (create_socket,(struct sockaddr &address, sizeof (address)) !=0)
und es geht