looking for Socket.select with maximum time or other solution

Charma Motoko_Kusanagi at web.de
Mon Oct 8 06:15:26 PDT 2007


Regan Heath schrieb:
> 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

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,
Charma


More information about the Digitalmars-d-learn mailing list