PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Problem mit select()



Silver
04-02-2004, 19:46
Hi Leute!

Ich mache gerad eine kleines Netzwerk-Spielchen mit SDL und hab aber ein Problem mit der Funktion select(). Ich weiss im Prinzip wie sie funktioniert, etc. Ok leider blockt auch select() solange sich kein Client zum Server verbunden, oder dieser Nachricht hat... Allgemein: auch select blockt so lange, bis es einen Input auf einen Socket hat.



int g_fdmax=höchster_Socket;
fd_set read_sfd;

// alle fd's mit FD_SET() hinzugefügt

select(g_fdmax+1, &read_sfd, NULL, NULL, NULL);


Auch wenn ich beim struct timeval tv_sec=0 übergebe, das gleiche! Wie könnte ich es ansonst schaffen, dass das Spiel nicht "steht" und ich die recv() nicht auf non-blocking setze??

mfG

Shack
04-02-2004, 22:04
Probier es mal so :

fd_set readfds;
FD_ZERO(&readfds);
FD_SET( sock , &readfds);

for (; ; ) {
fd_set readfds0 = readfds,

select(FD_SETSIZE, &readfds0,NULL, NULL, NULL);
if (FD_ISSET( sock, &readfds0)) {
struct sockaddr_in peeraddr_in;
socklen_t addrlen = sizeof peeraddr_in;
int s = accept( sock, (struct sockaddr *)&peeraddr_in, &addrlen);
if (s == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to accept connection\n", argv[0]);
return EXIT_FAILURE;
}
FD_SET(s, &readfds);

....

Silver
05-02-2004, 10:57
hi!

@Shack: nein, das ändert nix daran, er bleibt trotzdem beim Select immer stehen, solang ein Input ist! Bleibt mir also nix anderes übrig als einen Thread zu erstellen und select dort reinzuhaun! Naja, für was gibts denn Threads ;)!!!

mfG

ps: verwende das nächste mal bitte
wenn du Code postest!

EDIT: hab jetzt nochmals das Manual gelesen und wenn ich nun bei dem struct timeval bei beiden (!!) Werten 0 angebe, dann wartet er nicht mehr!

Badsteve
05-02-2004, 13:51
aus der Manpage:



struct timeval tv;
...
tv.tv_sec = 5;
tv.tv_usec = 0;
...


notfalls noch poll verwenden-