Problem mit Pthread [Chat]
-
Hallo,
ich habe vor kurzem mit c++ angefangen, und habe mir es zum Ziel gemacht, einen kleinen Chat zu schreiben.
Ich weiß, das man erstmal die Grundlagen lernen sollte, ich werde mir bald auch ein schickes C++ Buch kaufen.Ich bin gerade dabei die Serveranwendung zu schreiben, welche auf einem Linux-Server laufen sollte.
Diese soll Chatpartner annehmen (get_connection) und diese dann theoretisch in einem neuen Thread an HandleClient(int cl) weitergeben, damit die Verbindung nicht abbricht.Später soll über sendtoall(text) eine Nachricht an alle Clienten geschickt werden, welche in dem Clients-Array gespeichert sind.
Mein Problem ist folgender:
server.cpp:61: error: 'HandleCient' was not declared in this scopeDiese Meldung kommt beim kompilieren, was ja eigentlich bedeuten müsste, das die Funktion HandleClient nicht zugreifbar/sichtbar für den Thread ist?
Hier mein Server-Code:
#include <pthread.h> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <cstdlib> #include <memory.h> #include <string.h> #include <arpa/inet.h> #define EXTERN using namespace std; EXTERN int clients[100]; // Clientenarray deklarieren EXTERN int socks; //Server-Socket deklarieren void sendtoall(string text) { //Hier später eine Nachricht an alle Clienten schicken for(int i=0;i<=sizeof(clients)-1;i++) { char ctext[text.length()] ; strcpy(ctext,text.c_str()); try { send((int) clients[i], (char *) &ctext, sizeof(ctext), 0); } catch(...) { } } } void *HandleClient(void *cl) { //hier Verbindung zum Clienten halten bool running=true; while(running) { string text="Hallo"; char ctext[text.length()] ; strcpy(ctext,text.c_str()); try { send(*(int*) cl, (char *) &ctext, sizeof(ctext), 0); } catch(...) {running=false;} } } void *get_connection(void* val) { int cl_count=0; int s_client; socklen_t s_len; struct sockaddr_in client; for (;;) { int s_client=0; socklen_t s_len=0; struct sockaddr_in client; s_len = sizeof( client ); try { s_client = accept( socks, (struct sockaddr*)&client, &s_len); if (s_client < 0) { //Fehler bei accept() cout << "Fehler beim akzeptieren" << endl; } else { clients[cl_count]=s_client; cl_count++; clients[cl_count]=s_client; cl_count++; pthread_t thread; pthread_create(&thread, NULL, HandleCient , &s_client); //Hier soll dann der Client an HandleClient übergeben werden pthread_join(thread, NULL); } } catch(...) {} } } int main () { //int socks; socks = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server; server.sin_family= AF_INET; server.sin_port=htons(10066); server.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx"); cout << "Socket laeuft auf"<<endl; if(bind(socks,(struct sockaddr*)&server,sizeof(server))>=0) { cout << "Socket gebunden"<<endl; if(listen(socks,5) >= 0) { cout <<"Socklistening aktiviert"<<endl; } else { cout << "Fehler beim listen"<<endl; } } else { cout << "Fehler beim binden"<<endl; } pthread_t thread1; pthread_create(&thread1, NULL,&get_connection, NULL); //neuen Thread für accept89-routine pthread_join(thread1, NULL); return 0; }Ich verstehe es auch noch nicht so richtig, wie man eine Variable an den neuen Thread übergibt.
Ich habe es nach dieser Anleitung hier versucht:
https://computing.llnl.gov/tutorials/pthreads/Jedoch kommt es ja nichtmal bis dahin, da die Routine HandleClient nicht erkannt wird.
Ich hoffe, jemand kann mir helfen und besten Dank im vorraus.
Gruß
-
Du solltest deine Funktionsnamen schon korrekt schreiben, dann findet sie der Compiler auch
(und "HandleCient" ist etwas anderes als "HandleClient").
-
Was für einen Zweck hat das Makro
EXTERN? Der Quelltext ist eine Mutation aus C und C++.
-
Ok, danke, das ist dann schon selten dämlich...
Mit dem EXTERN wollte ich globale Variablen deklarieren.
Oder gibt es dafür auch noch einen anderen Weg?Gruß
-
Sie einfach deklarieren?