digitalmars.D.learn - looking for Socket.select with maximum time or other solution
- Charma (16/16) Oct 07 2007 Hello everyone!
- Nathan Reed (7/16) Oct 07 2007 How about, from another thread, killing the thread that is running
- Regan Heath (31/47) Oct 08 2007 This version of select takes a timeout parameter of type timeval:
- Charma (12/72) Oct 08 2007 Regan,
Hello everyone! I am currently working on a server which many clients can connect to and i am using socket.select with my socketset which all clients are in. This far everything works very fine. But i would prefer my server-loop to continue e.g. at least 10 times every second to work on other things even when nothing is send from clients. Is there anything i can do to force socket.select to stop waiting after a given time even if all sockets will stay as marked with nothing to receive? Maybe someone has an even better/other/different idea?!? Also i would like to know: Is there any way i can cancel socket.select while it is waiting? I mean, i would like to be able to quit my server clean without needing to connect with a client again and so on... Thanks for any suggestions and help!! Sorry about my engrish!! Charma
Oct 07 2007
Charma wrote:Hello everyone! I am currently working on a server which many clients can connect to and i am using socket.select with my socketset which all clients are in. This far everything works very fine. But i would prefer my server-loop to continue e.g. at least 10 times every second to work on other things even when nothing is send from clients.I'd use a separate thread for that.Also i would like to know: Is there any way i can cancel socket.select while it is waiting? I mean, i would like to be able to quit my server clean without needing to connect with a client again and so on...How about, from another thread, killing the thread that is running select? Yeah, a little bit clumsy, but at least you don't have to kill the process from the console. Thanks, Nathan Reed
Oct 07 2007
Charma wrote:Hello everyone! I am currently working on a server which many clients can connect to and i am using socket.select with my socketset which all clients are in. This far everything works very fine. But i would prefer my server-loop to continue e.g. at least 10 times every second to work on other things even when nothing is send from clients. Is there anything i can do to force socket.select to stop waiting after a given time even if all sockets will stay as marked with nothing to receive?This version of select takes a timeout parameter of type timeval: static int select(SocketSet checkRead, SocketSet checkWrite, SocketSet checkError, timeval* tv); you will need to reload the sockets into the set before every call.Maybe someone has an even better/other/different idea?!? Also i would like to know: Is there any way i can cancel socket.select while it is waiting?I believe you could interrupt it from another thread but I don't think that it is necessary, simply use a short timeout period and make the main loop check a termination variable eg. while(!timeToStop) { select...with short timeout. } Of course, you need some method of setting timeToStop, perhaps you check for keyboard input in the main loop, perhaps a client connection processes a command like "shutdown"... You can use a ticker/counter variable in the main loop to restrict how often certain tasks are carried out, eg. ticker=0 while(!timeToStop) { select...with timeout of 100ms (10x/sec) if (ticker%5 == 0) { //2x/sec //put stuff in here that only happens 2x/sec } ..etc.. } It may be a cleaner design, and better in the multi-cpu enviroment we have today to create a thread for each task, where the thread simply sleeps between tasks.I mean, i would like to be able to quit my server clean without needing to connect with a client again and so on...In that case perhaps a check for keyboard input is what you want. Regan
Oct 08 2007
Regan Heath schrieb:Charma wrote:Regan, As usual, you had exactly what i was looking for! For some reason, i don't know by myself, i was always overlooking that there exists a parameter for that... Thanks a lot! This solves my problem :) I want to avoid using threads to keep my server as fast and efficient as possible, so i will try to come up with something for a completly seperate connection which will be handled different from the other clients... Greetings, CharmaHello everyone! I am currently working on a server which many clients can connect to and i am using socket.select with my socketset which all clients are in. This far everything works very fine. But i would prefer my server-loop to continue e.g. at least 10 times every second to work on other things even when nothing is send from clients. Is there anything i can do to force socket.select to stop waiting after a given time even if all sockets will stay as marked with nothing to receive?This version of select takes a timeout parameter of type timeval: static int select(SocketSet checkRead, SocketSet checkWrite, SocketSet checkError, timeval* tv); you will need to reload the sockets into the set before every call.Maybe someone has an even better/other/different idea?!? Also i would like to know: Is there any way i can cancel socket.select while it is waiting?I believe you could interrupt it from another thread but I don't think that it is necessary, simply use a short timeout period and make the main loop check a termination variable eg. while(!timeToStop) { select...with short timeout. } Of course, you need some method of setting timeToStop, perhaps you check for keyboard input in the main loop, perhaps a client connection processes a command like "shutdown"... You can use a ticker/counter variable in the main loop to restrict how often certain tasks are carried out, eg. ticker=0 while(!timeToStop) { select...with timeout of 100ms (10x/sec) if (ticker%5 == 0) { //2x/sec //put stuff in here that only happens 2x/sec } ..etc.. } It may be a cleaner design, and better in the multi-cpu enviroment we have today to create a thread for each task, where the thread simply sleeps between tasks. > I mean, i would like to be able to quit my serverclean without needing to connect with a client again and so on...In that case perhaps a check for keyboard input is what you want. Regan
Oct 08 2007