<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit Pthread [Chat]]]></title><description><![CDATA[<p>Hallo,<br />
ich habe vor kurzem mit c++ angefangen, und habe mir es zum Ziel gemacht, einen kleinen Chat zu schreiben.<br />
Ich weiß, das man erstmal die Grundlagen lernen sollte, ich werde mir bald auch ein schickes C++ Buch kaufen.</p>
<p>Ich bin gerade dabei die Serveranwendung zu schreiben, welche auf einem Linux-Server laufen sollte.<br />
Diese soll Chatpartner annehmen (get_connection) und diese dann theoretisch in einem neuen Thread an HandleClient(int cl) weitergeben, damit die Verbindung nicht abbricht.</p>
<p>Später soll über sendtoall(text) eine Nachricht an alle Clienten geschickt werden, welche in dem Clients-Array gespeichert sind.</p>
<p>Mein Problem ist folgender:</p>
<pre><code class="language-cpp">server.cpp:61: error: 'HandleCient' was not declared in this scope
</code></pre>
<p>Diese Meldung kommt beim kompilieren, was ja eigentlich bedeuten müsste, das die Funktion HandleClient nicht zugreifbar/sichtbar für den Thread ist?</p>
<p>Hier mein Server-Code:</p>
<pre><code class="language-cpp">#include &lt;pthread.h&gt;
#include &lt;iostream&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;cstdlib&gt;
#include &lt;memory.h&gt;
#include &lt;string.h&gt;
#include &lt;arpa/inet.h&gt;
#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&lt;=sizeof(clients)-1;i++) {
        char ctext[text.length()] ;
        strcpy(ctext,text.c_str());
        try {
        send((int) clients[i], (char *) &amp;ctext, sizeof(ctext), 0);
        } catch(...) { }
}
}

void *HandleClient(void *cl) { //hier Verbindung zum Clienten halten
bool running=true;
while(running) {
string text=&quot;Hallo&quot;;
char ctext[text.length()] ;
 strcpy(ctext,text.c_str());

        try {
        send(*(int*) cl, (char *) &amp;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*)&amp;client, &amp;s_len);
        if (s_client &lt; 0) {
            //Fehler bei accept()
            cout &lt;&lt; &quot;Fehler beim akzeptieren&quot; &lt;&lt; endl;
        } else {
        clients[cl_count]=s_client;
        cl_count++;
        clients[cl_count]=s_client;
        cl_count++;
        pthread_t thread;
        pthread_create(&amp;thread, NULL, HandleCient , &amp;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(&quot;xxx.xxx.xxx.xxx&quot;);

  cout &lt;&lt; &quot;Socket laeuft auf&quot;&lt;&lt;endl;
         if(bind(socks,(struct sockaddr*)&amp;server,sizeof(server))&gt;=0) {
                cout &lt;&lt; &quot;Socket gebunden&quot;&lt;&lt;endl;
                if(listen(socks,5) &gt;= 0) {
                cout &lt;&lt;&quot;Socklistening aktiviert&quot;&lt;&lt;endl;
} else {
        cout &lt;&lt; &quot;Fehler beim listen&quot;&lt;&lt;endl;
}
   } else {
cout &lt;&lt; &quot;Fehler beim binden&quot;&lt;&lt;endl;
        }
  pthread_t thread1;
  pthread_create(&amp;thread1, NULL,&amp;get_connection, NULL); //neuen Thread für accept89-routine
  pthread_join(thread1, NULL);
  return 0;
}
</code></pre>
<p>Ich verstehe es auch noch nicht so richtig, wie man eine Variable an den neuen Thread übergibt.<br />
Ich habe es nach dieser Anleitung hier versucht:<br />
<a href="https://computing.llnl.gov/tutorials/pthreads/" rel="nofollow">https://computing.llnl.gov/tutorials/pthreads/</a></p>
<p>Jedoch kommt es ja nichtmal bis dahin, da die Routine HandleClient nicht erkannt wird.</p>
<p>Ich hoffe, jemand kann mir helfen und besten Dank im vorraus.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287293/problem-mit-pthread-chat</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 13:49:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287293.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 May 2011 19:52:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Pthread [Chat] on Wed, 25 May 2011 19:52:42 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe vor kurzem mit c++ angefangen, und habe mir es zum Ziel gemacht, einen kleinen Chat zu schreiben.<br />
Ich weiß, das man erstmal die Grundlagen lernen sollte, ich werde mir bald auch ein schickes C++ Buch kaufen.</p>
<p>Ich bin gerade dabei die Serveranwendung zu schreiben, welche auf einem Linux-Server laufen sollte.<br />
Diese soll Chatpartner annehmen (get_connection) und diese dann theoretisch in einem neuen Thread an HandleClient(int cl) weitergeben, damit die Verbindung nicht abbricht.</p>
<p>Später soll über sendtoall(text) eine Nachricht an alle Clienten geschickt werden, welche in dem Clients-Array gespeichert sind.</p>
<p>Mein Problem ist folgender:</p>
<pre><code class="language-cpp">server.cpp:61: error: 'HandleCient' was not declared in this scope
</code></pre>
<p>Diese Meldung kommt beim kompilieren, was ja eigentlich bedeuten müsste, das die Funktion HandleClient nicht zugreifbar/sichtbar für den Thread ist?</p>
<p>Hier mein Server-Code:</p>
<pre><code class="language-cpp">#include &lt;pthread.h&gt;
#include &lt;iostream&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;cstdlib&gt;
#include &lt;memory.h&gt;
#include &lt;string.h&gt;
#include &lt;arpa/inet.h&gt;
#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&lt;=sizeof(clients)-1;i++) {
        char ctext[text.length()] ;
        strcpy(ctext,text.c_str());
        try {
        send((int) clients[i], (char *) &amp;ctext, sizeof(ctext), 0);
        } catch(...) { }
}
}

void *HandleClient(void *cl) { //hier Verbindung zum Clienten halten
bool running=true;
while(running) {
string text=&quot;Hallo&quot;;
char ctext[text.length()] ;
 strcpy(ctext,text.c_str());

        try {
        send(*(int*) cl, (char *) &amp;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*)&amp;client, &amp;s_len);
        if (s_client &lt; 0) {
            //Fehler bei accept()
            cout &lt;&lt; &quot;Fehler beim akzeptieren&quot; &lt;&lt; endl;
        } else {
        clients[cl_count]=s_client;
        cl_count++;
        clients[cl_count]=s_client;
        cl_count++;
        pthread_t thread;
        pthread_create(&amp;thread, NULL, HandleCient , &amp;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(&quot;xxx.xxx.xxx.xxx&quot;);

  cout &lt;&lt; &quot;Socket laeuft auf&quot;&lt;&lt;endl;
         if(bind(socks,(struct sockaddr*)&amp;server,sizeof(server))&gt;=0) {
                cout &lt;&lt; &quot;Socket gebunden&quot;&lt;&lt;endl;
                if(listen(socks,5) &gt;= 0) {
                cout &lt;&lt;&quot;Socklistening aktiviert&quot;&lt;&lt;endl;
} else {
        cout &lt;&lt; &quot;Fehler beim listen&quot;&lt;&lt;endl;
}
   } else {
cout &lt;&lt; &quot;Fehler beim binden&quot;&lt;&lt;endl;
        }
  pthread_t thread1;
  pthread_create(&amp;thread1, NULL,&amp;get_connection, NULL); //neuen Thread für accept89-routine
  pthread_join(thread1, NULL);
  return 0;
}
</code></pre>
<p>Ich verstehe es auch noch nicht so richtig, wie man eine Variable an den neuen Thread übergibt.<br />
Ich habe es nach dieser Anleitung hier versucht:<br />
<a href="https://computing.llnl.gov/tutorials/pthreads/" rel="nofollow">https://computing.llnl.gov/tutorials/pthreads/</a></p>
<p>Jedoch kommt es ja nichtmal bis dahin, da die Routine HandleClient nicht erkannt wird.</p>
<p>Ich hoffe, jemand kann mir helfen und besten Dank im vorraus.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068742</guid><dc:creator><![CDATA[codecookie]]></dc:creator><pubDate>Wed, 25 May 2011 19:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Pthread [Chat] on Wed, 25 May 2011 19:55:01 GMT]]></title><description><![CDATA[<p>Du solltest deine Funktionsnamen schon korrekt schreiben, dann findet sie der Compiler auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> (und &quot;HandleCient&quot; ist etwas anderes als &quot;HandleC<strong>l</strong>ient&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068749</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 May 2011 19:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Pthread [Chat] on Wed, 25 May 2011 19:57:10 GMT]]></title><description><![CDATA[<p>Was für einen Zweck hat das Makro <code>EXTERN</code> ? Der Quelltext ist eine Mutation aus C und C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068752</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 25 May 2011 19:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Pthread [Chat] on Thu, 26 May 2011 05:46:31 GMT]]></title><description><![CDATA[<p>Ok, danke, das ist dann schon selten dämlich...</p>
<p>Mit dem EXTERN wollte ich globale Variablen deklarieren.<br />
Oder gibt es dafür auch noch einen anderen Weg?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068827</guid><dc:creator><![CDATA[codecookie]]></dc:creator><pubDate>Thu, 26 May 2011 05:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Pthread [Chat] on Thu, 26 May 2011 07:02:39 GMT]]></title><description><![CDATA[<p>Sie einfach deklarieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068856</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 26 May 2011 07:02:39 GMT</pubDate></item></channel></rss>