pthread bzw accept bug - oder dummer fehler? brauche hilfe
-
hallo,
ich habe folgendes problem: ich habe aus lernzwecken einen server-client messenger geschrieben. die sache funktioniert an sich gut, doch das problem ist das aus irgendeinen grund pthread_create stuck geht
szenarion: ein thread sieht so aus
void *new_connection(void *arg) { int c; while(1) { connfd = accept(listenfd, (SA *) &cliaddr, &lencli ); puts("new conn");fflush(stdout); inet_ntop(AF_INET, &cliaddr.sin_addr, fubert, sizeof(fubert)); puts("new conn2");fflush(stdout); pthread_create(&join_channel_tid,NULL,join_channel,(void *) connfd); puts("new conn3");fflush(stdout); //if ( c > maxc) maxc = c; //if (--count <= 0) continue; } }
ein client connected. new conn, new conn2 und new conn3 werden erstellt, pthread_create wird normal ausgeführt, wie es sein soll. es kann ein weiterer client connecten, dasselbe, alles ok
doch wenn ein client disconnected, und dann wieder einer connected, geht nix mehr. genauer: new conn und new conn2 werden ausgegeben; new conn3 nicht mehr, ebenso wenig die erste zeile von join_channel ( desses func der thread hat ).
es ist also klar: das programm bleibt im aufruf von pthread_create hängen. warum? ich konnte keinen finden der mir da helfen konnte
ich suchte mal bei google und fande hinweise das da wohl ein bug existiert
http://lists.freebsd.org/pipermail/freebsd-hackers/2003-May/001156.htmlwer weiss da was?
danke
p.s. wenns hilft, den komplette source gibts auf
-
Pro Thread eine tid!
> pthread_create(&join_channel_tid,NULL,join_channel,(void
connfd);
Diese Zeile in einer Schleife ist relativ sinnfrei
-
mh echt? ich dahcte der thread wird erstellt, und beim 2. mal wird die alte tid einfach überschrieben, ich brauch die ja eh ent. und wieso geht das nur nicht wenn einer disconnected, es geht aber wenn merhere gleichzeitig oder nacheinanderconnecten.
und wie soll ich das denn programmiertechnisch sonst lösen?
dankeschonmal
-
mh echt? ich dahcte der thread wird erstellt, und beim 2. mal wird die alte tid einfach überschrieben, ich brauch die ja eh ent. und wieso geht das nur nicht wenn einer disconnected
Ah das ist gewollt.. Na dann Mahlzeit!
Der Fehler liegt hier:
bytes = recv(sockfd, channel,sizeof(channel),0);
printf("Channel: %s", channel);Ich hab keine Lust dir jetzt im Detail darzustellen was jetzt im Detail passiert wenn der Client die Verbindung schließt.
nd wie soll ich das denn programmiertechnisch sonst lösen?
# rm msdg2.c
Sehr viel über Sockets lernen.
Sehr viel über Threads lernen.und dann
# $EDITOR main.c
mfg
-
öhm das hilft jetzt aber auch nicht weiter
bytes = recv(sockfd, channel,sizeof(channel),0);
printf("Channel: %s", channel);wo soll da ein fehler seien
es gab davor eine version, da funktionierte alles wunderbar ( ja auch mit dem tid überschreiben und den beiden zeilen daoben ) doch da brauchte er 100% cpu, daher hab ich das mit der pipe eingebaut. funktioniert ja gut, nur plötzlich gehen die alten techniken anscheinend net mehr?!
# rm msdg2.c
Sehr viel über Sockets lernen.
Sehr viel über Threads lernen.und dann
# $EDITOR main.c
was ein schwachsinn, bleiben wir beim wesentlichen.
-
so, es scheint jetzt alles zu gehen. wie gesagt lagts weder an der tid geschichte noch an den beiden zeilen die du als fehlerhaft interepretiert hast
-
wo soll da ein fehler seien
Dein Code macht es unmöglich auf eine Verbindungstrennung der Clientseite zu reagieren. Außerdem werden evtl. auftretende Fehler nicht überprüft. Beides bezeichne ich als Fehler schwerster Art, da sie deinen Server davor bewahren stabil zu laufen.
es gab davor eine version, da funktionierte alles wunderbar ( ja auch mit dem tid überschreiben und den beiden zeilen daoben )
Unter wunderbar laufen verstehe ich etwas anderes als, "lässt sich zwar mit massig Warnungen kompilieren dafür SEGFAULT es nicht!"
was ein schwachsinn, bleiben wir beim wesentlichen
Das ist wahrscheinlich noch das Sinnvollste was du machen kannst. Am besten nimmst du noch ein Grundkurs ANSI-C dazu! Mir sticht da nämlich grad folgendes ins Auge:
#define MAXCLIENTS 49 struct client { [..] } client[MAXCLIENTS]; for ( c = 0; c <= MAXCLIENTS; c++) client[c].sockfd = -1;
mfg
-
es kommt keine einzige warnung, ich versteh garnicht was du hast
und was an den von dir genannten zeilen nun wieder fehlerhaft seien soll ist mir auch wieder schleierhaft.
-
und was an den von dir genannten zeilen nun wieder fehlerhaft seien soll ist mir auch wieder schleierhaft.
Deswegen sollst du dir auch Nachhilfe über ANSI-C besorgen.
-
freeka schrieb:
und was an den von dir genannten zeilen nun wieder fehlerhaft seien soll ist mir auch wieder schleierhaft.
Du schreibst in das 50. Array-Element, obwohl das Array nur 49 Elemente hat.
-
was?
wenn c <= 49 ist wird ne -1 reingeschrieben. ist c 50 ist es net mehr <= 49 und da wird nix mehr geschriebenegal, wie oben gesagt geht ja jetzt alles
-
und wo hast das array nur 49 elemente? es hat genau 50, 0-49
naja ihr seht wohl ueberall fehler. die tid sache funktioniert, die 2 zeilen wo du meintest das sei falsch geht, etc. ich hab auch keine segfaults und warning oder sonst was was du behaupted hast.
-
freeka schrieb:
und wo hast das array nur 49 elemente? es hat genau 50, 0-49
Und warum setzt Du dann MAXCLIENTS auf 49, wenn das Array 50 Elemente haben soll?
-
SG1 schrieb:
freeka schrieb:
und wo hast das array nur 49 elemente? es hat genau 50, 0-49
Und warum setzt Du dann MAXCLIENTS auf 49, wenn das Array 50 Elemente haben soll?
weils dann genau 50 elemente hat? ich versteh das problem nicht. dadurch das MAXCLIENTS 49 ist hat das array 50 elemente, die 49 halt + die null.
daher setze ich MAXCLIENTS auf 49, weil das array dann 50 elemte hat o_O
-
Nein. Der Grundkurs ANSI-C ist wohl wirklich noetig.
-
hi,
@ freeka: SG1 meint folgendes:#define MAXCLIENTS 49 struct client { [..] } client[MAXCLIENTS]; // entspricht client[49] => Arrayelemente von 0-48 => nur 49 Elemente keine 50
Bei der Anzahl der Elemente zählt man völlig normal. Nur beim Zugriff auf diese muss man beachten, dass das erste Element, das null Element ist und das letzte halt Anzahl-1.
Tschau Gartenzwerg
-
WAS?
das bedeuted
client[50]
da sind die elemente
client[0]-client[49] enthalten und das client[50] gibts garnicht?höre ich zum ersten mal oder ich habs damals nicht ganz gecheckt
@SG1 & gast__
war das zuviel verlangt? stattdessen immer nur diese arroganten kommentare "haha da ist wohl ein grundkurs ansi-c fällig". find ich ziemlich miesjedenfalls danke gartenzwerg... aber hier werd ich nicht so schnell wieder nachfragen auch wenn ich damit einigen unrecht tun werde
-
WAS?
das bedeuted
client[50]
da sind die elemente
client[0]-client[49] enthalten und das client[50] gibts garnicht?höre ich zum ersten mal oder ich habs damals nicht ganz gecheckt
@SG1 & gast__
war das zuviel verlangt? stattdessen immer nur diese arroganten kommentare "haha da ist wohl ein grundkurs ansi-c fällig". find ich ziemlich miesjedenfalls danke gartenzwerg... aber hier werd ich nicht so schnell wieder nachfragen auch wenn ich damit einigen unrecht tun werde
-
WAS?
das bedeuted
client[50]
da sind die elemente
client[0]-client[49] enthalten und das client[50] gibts garnicht?höre ich zum ersten mal oder ich habs damals nicht ganz gecheckt
@SG1 & gast__
war das zuviel verlangt? stattdessen immer nur diese arroganten kommentare "haha da ist wohl ein grundkurs ansi-c fällig". find ich ziemlich miesjedenfalls danke gartenzwerg
aber hier werd ich nicht so schnell wieder nachfragen auch wenn ich damit einigen unrecht tun werde
-
WAS?
das bedeuted
client[50]
da sind die elemente
client[0]-client[49] enthalten und das client[50] gibts garnicht?höre ich zum ersten mal oder ich habs damals nicht ganz gecheckt
@SG1 & gast__
war das zuviel verlangt? stattdessen immer nur diese arroganten kommentare "haha da ist wohl ein grundkurs ansi-c fällig". find ich ziemlich miesjedenfalls danke gartenzwerg
aber hier werd ich nicht so schnell wieder nachfragen auch wenn ich damit einigen unrecht tun werde