PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c/c++]



navi
26-10-2004, 15:32
Also ich hab ein select in dem ein socket im read_fds wartet. Nun hab ich noch den STDIN (0) hinzugefuegt un will dass bei beiden einfach unterbrochen wird wenn ich sie auslesen kann. Bei dem socket funzt das, nur bei dem STDIN net. Ich hab keinen Plan warum net. Code sieht so aus (gekuerzt):



FD_ZERO(&read_fds);
FD_SET(s_new, &read_fds);
fdmax = s_new;

// add STDIN to select
FD_SET(STDIN, &read_fds);
if(STDIN > fdmax)
fdmax = STDIN;

// working loop
while(1)
{
if((ret = select(fdmax+1, &read_fds, NULL, NULL, NULL)) == -1)
{
cerr << ERR_SELECT << endl;
exit(1);
}

if(FD_ISSET(STDIN, &read_fds))
read(STDIN,msg_buffer,MAXDATASIZE-1);

anda_skoa
26-10-2004, 18:04
STDIN ist vermutlich gepuffert, hattest du bei deinem Test ein Newline im Input (zB durch ENTER)?

Ciao,
_

navi
26-10-2004, 20:42
Ich hzab das ganze ja schon getestet indem ich nur diese Tastatureingabe genommen hab und da hats ja auch getan, aber sobald ich nen socket mit reinschmeiss gehts nemme. Voll der Mist.

navi
26-10-2004, 21:53
OK hab jetzt eine Loesung.
Hab zwei select() mit timeout hintereinander in einer Unendlichschleife, und ich muss vor jedem select() den STD neu setzen. Warum weis ich net.
Jetzt laeuft es aber. Weis jemand was zu diesem Problem mit dem neu setzen?

Joghurt
28-10-2004, 12:23
In deinem geposteten Code hast du NULL als timeout* übergeben. Kein Wunder, dass das nicht funktioniert.
Probiers mal mit
...
main() {
...
struct timeval timeout;
timeout.tv_usec = 0;
timeout.tv_sec = 5;
...
select(...,&read_fds,NULL,NULL,&timeout)
}

navi
30-10-2004, 17:12
Ja aber es soll ja kein timeout stattfinden. Der Sinn von dem select ist doch dass wenn eine Eingabe kommt, dass das select dann beendet wird und der code danach ausgeführt wird. Wenn ich das Timeout rein mach dann heist dass ich will nur 5 sec oder so auf eine Eingabe warten und dann aufhoeren. Das ist aber hier nicht der Fall. Er soll ja unendlich auf eine Eingabe warten. Ich kann nur irgendwie net gleichzeitig auf einen socket und den stdin warten.