accept() blockiert nach 2. aufruf
-
Hallo,
also mein Cod esieht im groben so aus
while(1) { printf("SERVER CHILD waiting on port: %d\r\n", gl_port); printf("id: %d\n", gl_cl_sckt_id); /* could be a wrapper function */ client = accept(gl_cl_sckt_id, (struct sockaddr *) &cli_addr, &cli_size); //... }
ich verbinde mit einem client und die erste Anfrage wird ganz normal von accept() durchgelassen, aber mach ich danach die selbe Anfrage nochmal, blockiert accept().
Weiß jemand eine mögliche Ursache für das Blockieren?
-
Wie hast du die Verbindung beendet?
Werden die beiden Ausgaben beim zweiten Mal angezeigt?
Der Fehler könnte auch weiter hinten sein, wo du Code ausgeschnitten hast. Etwas mehr wäre da wünschenswert
-
aber bitte nicht zu viel code
ein darstellendes beispiel ohne irrelevanten kram bitte.
-
ich hab das schon geprüft, es bleibt definitiv an diesem accept hängen. Ja, die Ausgaben werden gemacht.
Der Client hängt beim recv(), logischerweise.
Ich denke nicht, dass euch Code was bringt. Wie gesagt, der erste Durchlauf klappt, dann blockiert accept.
Ich habe schon die Socket ID geprüft, ob die sich evtl. verändert, aber das ist nicht der Fall.
Solche Fehlerquellen würde ich gerne lesen, der Code würde euch nichts bringen. Ich würde einfach nur gern mögliche Ursachen für so ein Verhalten erfahren. Das würde mir weiterhelfen.
-
Na dann wollen wir mal:
Mögliche Ursache: Es connected einfach kein zweiter Client?
-
hm, also ich habe nur einen client. Dieser hat ein Menue in einer Schleife:
do { printf("MENUE ++++++++++++++++++++++++++++++++\r\n"); printf("1 CLOSE :: "); printf("2 ACTUAL BID :: "); printf("3 SET BID\r\n"); printf("YOUR CHOICE: "); scanf("%d", &status); switch(status) { case SET_BID: /* setting and sending a bid */ send_bid(set_bid()); break; case ACTUAL_BID: /* getting auction data */ get_auction_data(auction); break; case CLOSE_CLIENT: /* sending close flag to server child */ close_client(); break; default: /* illegal char */ status = MENUE; break; } } while(status != CLOSE_CLIENT);
und alle 3 Aktionen funktionieren nur beim ersten aufruf, beim zweiten Aufruf bleibt es definitiv am accept hängen. Das erkenne ich nicht nur an der Ausgabe beim Client, dass er beim recv() hängen bleibt, sondern auch daran, dass das CLOSE beim client auch beim zweiten mal funktioniert, nur dass das Flag per send() nicht beim Server ankommt, der aber eigentlich per accept() ja gerade auf sowas wartet...
edit:
ich habe mit einem zweiten Client verbunden und da ist das selbe Problem.Also ich habe eigentlich 2 Server Prozesse. Einen Server Parent und einen Server Child. Jeder Client hat einen eigenen Server Child Prozess - paralleler Server eben. Und der Server Child ist das Problem, da bockiert accept() beim 2. Aufruf.
-
Wieso wartet der Client mit recv() auf Daten und der Server mit accept()?! Mit accept() wartest Du auf einen neuen Client.
-
aaahhh
Das wird wohl mein Fehler sein. Das hört sich logisch an.
Der Server Child muss also auch per recv() warten, richtig?
Der erste Aufruf klappt dann deshalb, weil der Client sich da zum ersten mal überhaupt meldet. Ok, jetzt ist es logisch...
Danke, ich werd mich melden, wenns klappt...und wenn nicht auch.
EDIT
Das wars. Jetzt klappts. Nochmal vielen dank.