Threaded-Server.verschiedene-Ports
-
hat keiner eine idee an was es liegen könnte?
-
Was mir so beim drüberschauen auffällt: die einzelnen Threads scheinen in die Arrays zu schreiben und zu lesen ohne Rücksicht aufeinander.
Das macht mit Sicherheit Probleme.Tipp: benutz zum Setzen des Speichers doch memset statt der for-Schleife.
-
Ja das memset werde ich einbauen, ob es zum Sachverhalt was ändert ist ne andere Frage.
Die einzelnen Threads schreiben ja zwar in das selbe array aber an verschiedenen Stellen. Außerdem habe ich es nur mit einem Client getestet => es wird auch nur ein Thread auf das Array schreiben!
-
Aber du hast doch (mindestens) 2 Thread Input + Connect - auch bei nur einem Client.
Die beiden Funktionen benutzen doch die Arrays und laufen in getrennten Threads.
So kann es passieren, dass A auf ein Array schreibt und B währenddessen liest.-> B liest Müll
-
ja schon.
aber das erklärt ja nicht warum der server einmal was empfängt, dann nur teile und dann nichts.das array wird nur für die interne kommunikations des servers verwendet, dass er weiß wann der user einen befehl eingetippt hat. was an den server gesendet wird, wird ja per recv() ausgewertet.
oder verstehe ich was falsch?
-
also scheinbar ist API lesen nicht mehr modern. denn wenn man sich die API von pthread anschaut sieht man, dass soetwas hier nicht funktionieren kann:
pthread_create(&tid, NULL, connect_, port+i);
auch dein compiler gibt warnungen.
server.c: In Funktion »main«: server.c:141: Warnung: Übergabe des Arguments 3 von »pthread_create« von inkompatiblem Zeigertyp server.c:141: Warnung: Übergabe des Arguments 4 von »pthread_create« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung server.c:147: Warnung: Übergabe des Arguments 3 von »pthread_create« von inkompatiblem Zeigertyp
blan
-
wie muss es dann heißen?
lg
-
theaded schrieb:
wie muss es dann heißen?
pthread_create erwartet eine Funktion von folgendem Typ:
void * (*func) (void*)
Also hier in deinem Fall:
static void * connect_(void* vport) { int port = (int) vport; ... if (bind(...) == -1) { ... return (void*) 3; } ... } ... pthread_create(&tid, NULL, connect_, (void*)(port+i)); ...
Wobei ich die Casts nicht bevorzugen würde, da dabei ein int in einem
void* versteckt wird.Dann doch lieber so:
static void *connect_(void* threadargs) { int port = *(int*)threadargs; ... if (bind(...) == -1) { *(int*)threadargs = 3; return threadargs; } } ... int *threadargs = malloc(k*sizeof(*threadargs)); for (i=0; i<k; ++i) { threadargs[i] = port+i; pthread_create(&tid, NULL, connect_, threadargs+i); } ...
Ich hoffe, ich habe mich verständlich genug ausgedrückt und du erkennst
den Unterschied.Gruß mcr
-
Ja danke, war sehr verständlich!
Habe das verstanden.Nun habe ich meinen Code entsprechend abgeändert, jedoch funktioniert es leider trotzdem nicht
-
threader schrieb:
Ja danke, war sehr verständlich!
Habe das verstanden.Nun habe ich meinen Code entsprechend abgeändert, jedoch funktioniert es leider trotzdem nicht
gib uns bitte mal auch den Code von deinem Client, damit wir esauch mal ausprobieren können. Danke.
Gruß mcr